静态成员在C#中是否有等效的this
?
我喜欢使用this
来使我的代码更具可读性,但想知道是否有静态成员的等效代码。
答案 0 :(得分:13)
我想如果你使用this.
强化你指的是实例成员,那么静态成员中的等价物就是使用ClassName.
但从风格上讲,为什么要添加不会改变含义的代码?
编辑 以添加各种说明:
上面的句子可以用这些例子来说明:
class Example1
{
public int J { get; set; }
public Example1()
{
J = 0;
}
// These two methods have *exactly* the same CIL
public int InstanceMethodLong()
{
return this.J;
}
public int InstanceMethodShort()
{
return J;
}
}
与this.
相比,InstanceMethodLong
中的InstanceMethodShort
不会改变其含义。
静:
class Example2
{
public static int K { get; set; }
static Example2()
{
K = 0;
}
// These two methods have *exactly* the same CIL
public int StaticMethodLong()
{
return Example2.K;
}
public int StaticMethodShort()
{
return K;
}
与Example2.
相比,StaticMethodLong
中的StaticMethodShort
不会改变其含义。
在这两种情况下,添加限定符会产生相同的CIL,相同的行为,并且是写入,读取和理解的更多源。 文体 - 我很乐意接受这是代码风格的问题 - 我认为没有理由在那里。
对于下划线前缀,情况略有不同:
class Example3
{
int _j;
public int J
{
get { return _j; }
set
{
_j = value;
// and do something else,
// to justify not using an auto-property
}
}
public Example3()
{
J = 0;
}
public int MethodWithParameter(int j)
{
// Now there is a *difference* between
return j;
// and
return _j;
}
}
此处,在MethodWithParameter
中,引用_j
和j
之间存在差异 - 因此我们会刻意并明确地表达不同的含义。确实,编译器并不关心我们所谓的变量名称,但它确实关心我们所指的变量!因此,在MethodWithParameter
的正文中,使用或不使用下划线不仅仅是风格的,它是语义的。这不是我们在这个问题中要解决的特殊问题。
答案 1 :(得分:3)
由于静态成员不属于任何特定实例(因为this
指的是对象的实例,每个实例可能有不同的设置),您想要做的是使用{{ 1}}而不是ClassName.Member
。
this.Member
将被召唤:
public class Orange
{
public static string Tastes = "sweet";
public static string FoodType(){
return "fruit";
}
}
静态方法也是如此:
Console.WriteLine(Orange.Tastes);
请注意,这是一个仅供演示的人为举例。 :)
答案 2 :(得分:2)
您可以使用类名来引用其他静态属性。
你的代码对复制/粘贴的抵抗力有点强,但这并不总是坏事。
答案 3 :(得分:2)
不幸的是,静态方法没有this
。为了帮助区分静态成员和类成员,我在其前面添加了类名。
class Test {
static Regex TextRegex = new Regex(...);
public static bool TestString(string input) {
return Test.TextRegex.IsMatch(input);
}
}
答案 4 :(得分:1)
我喜欢“这个”,也可以从状态正在变化的第一眼看出来。在这种情况下,您可能需要考虑静态成员的类型名称。