Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是';这';在C语言中用于?_C#_.net_Syntax_This - Fatal编程技术网

C# 什么是';这';在C语言中用于?

C# 什么是';这';在C语言中用于?,c#,.net,syntax,this,C#,.net,Syntax,This,我读过开源c#code,有很多奇怪的语法(对我来说) 它们使用this关键字声明方法参数,如下所示: 此对象@object 这是什么意思 如果我删除数据类型前面的'this'关键字,那么它的工作方式会有所不同吗?听起来像是一个错误 @符号允许变量名与C#关键字相同-我个人倾向于避免使用它们 如果删除this关键字,它将不再是一个扩展方法,而只是一个静态方法。根据调用代码语法,它可能不再编译,例如: public static class IntegerMethods { public s

我读过开源c#code,有很多奇怪的语法(对我来说)

它们使用this关键字声明方法参数,如下所示:

此对象@object

这是什么意思

如果我删除数据类型前面的'this'关键字,那么它的工作方式会有所不同吗?

听起来像是一个错误

@
符号允许变量名与C#关键字相同-我个人倾向于避免使用它们

如果删除
this
关键字,它将不再是一个扩展方法,而只是一个静态方法。根据调用代码语法,它可能不再编译,例如:

public static class IntegerMethods
{
    public static int Add(this int i, int value)
    {
        return i + value;
    }
}

int i = 0;

// This is an "extension method" call, and will only compile against extension methods.
i = i.Add(2); 
// This is a standard static method call.
i = IntegerMethods.Add(i, 2);
编译器将以任何速率将所有“扩展方法调用”简单地转换为标准静态方法调用,但是扩展方法调用仍然只能根据
this type name
语法对有效的扩展方法起作用

一些指导原则

这些是我自己的,但我发现它们很有用

  • 扩展方法的可发现性可能是一个问题,所以请注意您选择在其中包含它们的名称空间。我们在.NET名称空间下有非常有用的东西,比如
    System.Collections
    或其他任何东西。不太有用但在其他方面“普通”的东西倾向于使用
    扩展。
    这样,可发现性至少通过约定是一致的
  • 尽量不要在广泛的范围内扩展经常使用的类型,你不希望
    MyFabulousExtensionMethod
    出现在整个应用程序的
    object
    上。如果需要,可以将作用域(名称空间)限制为非常特定的,或者绕过扩展方法直接使用静态类——这不会污染IntelliSense中的类型元数据
  • 在扩展方法中,“this”可以是
    null
    (由于它们是如何编译成静态方法调用的),所以要小心,不要假设“this”不是null(从调用方来看,这看起来像是对null目标的成功方法调用)

这些都是可选的,并非详尽无遗,但我发现它们通常属于“好”建议的范畴。YMMV.

此类型名称语法用于扩展方法

例如,如果我想在字符串中添加一个
UnCamelCase
方法(这样我就可以执行
“HelloWorld”.UnCamelCase()
来生成“Hello World”-我会这样写:

public static string UnCamelCase(this string text)
{
    /*match any instances of a lower case character followed by an upper case 
     * one, and replace them with the same characters with a space between them*/
    return Regex.Replace(text, "([a-z])([A-Z])", "$1 $2");
}
此字符串文本
表示您正在使用的字符串的特定实例,文本是该字符串的标识符


@语法允许变量通常是保留的。< /P> C >语法非常好,实际上,如果你把它与C++比较。我只用了扩展方法,调用<代码>这个< /Cord>参数>代码> @ <代码>。虽然我得出的结论是“太可爱了”。“@MatthewWatson,我只是调用

这个
参数
self
。可以工作。