在Nutshell中考虑C#5.0中的以下代码,p.289:
int[] numbers = { 1, 2, 3, 4, 5 };
Array.Sort (numbers, (x, y) => x % 2 == y % 2 ? 0 : x % 2 == 1 ? -1 : 1);
Run Code Online (Sandbox Code Playgroud)
给出了结果{3, 5, 1, 2, 4}.
我在纸上尝试了这个并得到了 {1, 3, 5, 2, 4}.
为什么计算机排序3 > 5 > 1?
假设我有以下C#函数:
void Foo(int bar, params string[] parpar) { }
Run Code Online (Sandbox Code Playgroud)
我想使用命名参数调用此函数:
Foo(bar: 5, parpar: "a", "b", "c");
Run Code Online (Sandbox Code Playgroud)
编译器给出错误消息:"命名参数不能位于位置",因为我在"b"和"c"之前没有名称.
有没有办法使用命名参数而不手动将params表示为数组?
ECMA-335,1.8.2.4指定可盒装类型包括引用类型(不包括托管指针/ byrefs)和通用参数.
拳击参考类型的目的是什么?与未装箱的参考对象相比,盒装参考对象的功能和内存表示是否有任何不同?
考虑以下IL代码:
.method public static void Main()
{
ldstr "Starts Here"
call void [mscorlib] System.Console::WriteLine(string)
.try {
ldstr "Try Me!"
call void [mscorlib] System.Console::WriteLine(string)
leave.s Done
}
catch [mscorlib] System.Exception {
ldstr "Catch Me!"
call void [mscorlib] System.Console::WriteLine(string)
leave.s Done
}
Done:
ldstr "Ends Here"
call void [mscorlib] System.Console::WriteLine(string)
ret
}
Run Code Online (Sandbox Code Playgroud)
CLR如何try在JIT编码中定义块?本机代码看起来如下:
...
00900076 8b0538214703 mov eax,dword ptr ds:[3472138h] ("Starts Here")
...
00900090 8b053c214703 mov eax,dword ptr ds:[347213Ch] ("Try Me!")
...
009000a2 eb1b jmp 009000bf ;// Done
009000a4 8945d4 …Run Code Online (Sandbox Code Playgroud) C# 7 引入了局部嵌套函数。它们为代码提供了更好的结构,但它们是否提高了可读性?是否有任何标准、建议和最佳实践?对于您的眼睛和美感,什么更容易阅读?
class Nested
{
void Foo()
{
void Bar()
{
}
void Baz()
{
}
Bar();
Baz();
}
}
class Usual
{
void Bar()
{
}
void Baz()
{
}
void Foo()
{
Bar();
Baz();
}
}
Run Code Online (Sandbox Code Playgroud) 考虑 ASP.Net Core 的视图文件中的以下两行:
@Component.InvokeAsync("Greeting").Result
@await Component.InvokeAsync("Greeting")
Run Code Online (Sandbox Code Playgroud)
有什么不同?哪种情况下更可取?在我的代码中,它们都给出相同的视觉结果;是否存在结果可能不同的情况?
我想调试表达式并将表达式树保存到文件中:
var generator = DebugInfoGenerator.CreatePdbGenerator();
var document = Expression.SymbolDocument(fileName: "MyDebug.txt");
var debugInfo = Expression.DebugInfo(document, 6, 9, 6, 22);
var expressionBlock = Expression.Block(debugInfo, fooExpression);
var lambda = Expression.Lambda(expressionBlock, parameters);
lambda.CompileToMethod(method, generator);
var bakedType = type.CreateType();
return (type)bakedType.GetMethod(method.Name).Invoke(null, parameters);
Run Code Online (Sandbox Code Playgroud)
如何查找或保存"MyDebug.txt"?
假设我有.Net应用程序App.exe,它创建三个域:DomainA,DomainB和DomainC.
我们可以说CLR会为App.exe进程分配一些物理内存,然后这个内存在我们的三个域之间分成一定比例吗?
或者对于每个新域,独立于App.exe和其他域分配的内存给出一个新的独立内存部分?
简单来说:我可以将逻辑内存分配想象为带有歌曲的(顺序)磁带(其中歌曲是AppDomans),或者作为一种FAT32,其中文件随机定位,我们只知道它们在磁盘上的位置?
ECMA-335,III.2.4指定tail.可用于递归函数的前缀.但是,我无法在C#和F#代码中找到它的用法.有没有使用的例子?
假设我有两个点,int x1, x2哪里x1可以更大,更小或相等x2.我想生成这两个点之间的所有整数(包括开头x1和结尾x2),或者只是x1两个点相等的值.是否有任何优雅的方式来生成IEnumerable<int>这些值?
在 SpecFlow步骤定义的文档中,它显示了一个示例,您可以在场景中使用逗号分隔列表在步骤定义中创建列表:
例如:
鉴于我“周二、周五、周日”有空
会导致:
@Given("I am available on \"(.+)\"")
public void I_have_cukes_in_my_belly(List<String> days) {
// Do something with the days
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我这样做时,我得到了这个:
@Given("I am available on ""(.*)"")
public void I_have_cukes_in_my_belly(string days) {
// Do something with the days
}
Run Code Online (Sandbox Code Playgroud)
我使用的是 VS 2012 和 SpecFlow 1.9.1 版本。有谁知道我可能做错了什么?或者我该如何解决这个问题?
提前致谢。
我正在编写ILAsm函数,它接收可变数量的参数并返回它们的总和:
.class public auto ansi TestSentinel
{
.method public static vararg unsigned int64 Sum( /* all arguments are optional */ )
{
.locals init( value class [mscorlib]System.ArgIterator Args,
unsigned int64 Sum,
int32 NumArgs )
...
ldloc Sum
ret
}
}
Run Code Online (Sandbox Code Playgroud)
我的DLL编译成功但我不能用C#代码调用这个函数.我打电话的时候
var k = TestSentinel.Sum(1);
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
Error The best overloaded method match for 'TestSentinel.Sum(__arglist, ...)' has some invalid arguments
Run Code Online (Sandbox Code Playgroud)
我收到任何其他数量的论据wrong argument number.调用我的ILAsm函数的正确方法是什么?
假设我们有以下代码:
/// <summary>
/// Test class comment
/// </summary>
public class Test
{
/// <summary>
/// Method comment
/// </summary>
/// <param name="a">First parameter comment</param>
/// <param name="b">Second parameter comment</param>
/// <returns>Return value comment</returns>
public int Foo(int a, int b) { return 1; }
}
Run Code Online (Sandbox Code Playgroud)
C#编译器在汇编中存储注释的位置?如果IntelliSence可以使用评论,我也想要.