我已经阅读了开源的c#代码,并且有很多奇怪的语法(对我而言)。
他们使用 this 关键字声明方法参数,如下所示:
此对象@object
这是什么意思?
如果我删除数据类型之前的'this'关键字,那么它的工作方式会不同吗?
答案 0 :(得分:23)
听起来像Extension Method。
@
符号允许变量名称与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
语法对有效的扩展方法起作用。
一些指南
这些是我自己的,但我觉得它们很有用。
System.Collections
或其他)下有非常有用的内容。不太有用但其他“常见”的东西倾向于Extensions.<namespace of extended type>
以下,因此可发现性至少符合惯例。MyFabulousExtensionMethod
出现object
。如果需要,或者将范围(命名空间)限制为非常特定,或绕过扩展方法并直接使用静态类 - 这些不会污染类型元数据在IntelliSense中。null
(由于它们如何编译成静态方法调用)所以要小心并且不要假设“this”不为null(从调用端看这个看起来就像在null目标上成功调用方法一样。)这些是可选的,并非详尽无遗,但我发现它们通常属于“好”建议的旗帜。 YMMV。
答案 1 :(得分:4)
'this type name'语法用于扩展方法。
例如,如果我想在字符串中添加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");
}
this string text
表示您正在使用的字符串的特定实例,text是其标识符。
@语法允许通常保留的变量名称。