对于静态成员,C#中是否存在“this”的等价物?

时间:2011-02-02 15:06:05

标签: c#

静态成员在C#中是否有等效的this

我喜欢使用this来使我的代码更具可读性,但想知道是否有静态成员的等效代码。

5 个答案:

答案 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中,引用_jj之间存在差异 - 因此我们会刻意并明确地表达不同的含义。确实,编译器并不关心我们所谓的变量名称,但它确实关心我们所指的变量!因此,在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)

我喜欢“这个”,也可以从状态正在变化的第一眼看出来。在这种情况下,您可能需要考虑静态成员的类型名称。