什么是'this'用于c#语言
本文关键字:语言 用于 this 什么 | 更新日期: 2023-09-27 18:12:55
我读过开源的c#代码,其中有很多奇怪的语法(对我来说)。
它们用this关键字声明方法参数,如下所示:
this object @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
或其他。不太有用但"常见"的东西往往属于Extensions.<namespace of extended type>
,这样可发现性至少通过惯例保持一致。 - 尽量不要在大范围内扩展经常使用的类型,你不希望
MyFabulousExtensionMethod
在整个应用程序中出现在object
上。如果你需要,要么将范围(命名空间)限制为非常特定,或者绕过扩展方法直接使用静态类-这些不会污染智能感知中的类型元数据。- 在扩展方法中,"this"可以是
null
(由于它们如何编译成静态方法调用),所以要小心,不要假设"this"不是null(从调用端来看,这看起来像一个成功的方法调用一个空目标)。 - 在扩展方法中,"this"可以是
这些都是可选的,并不详尽,但我发现它们通常都属于"好"建议的范畴。YMMV .
'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是它的标识符。
@语法允许通常保留的变量名