繁体   English   中英

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

[英]Is there an equivalent of 'this' in C# for static members?

是否有一个相当于this在C#中的静态成员?

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

我想如果你使用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 ,使用或不使用下划线只是风格上,它的语义。 这不是我们在这个问题中解决的特殊问题。

由于静态成员不属于任何特定实例(因为this指的是对象的实例,每个实例可能有不同的设置),所以您想要做的是使用ClassName.Member而不是this.Member

public class Orange
{
    public static string Tastes = "sweet";

    public static string FoodType(){
        return "fruit";
    }
}

将被称为:

Console.WriteLine(Orange.Tastes);

静态方法也是如此:

Console.WriteLine(Orange.FoodType()).

请注意,这是一个仅供演示的人为举例。 :)

您可以使用类名来引用其他静态属性。

你的代码变得更容易复制/粘贴,但这并不总是坏事。

不幸的是,静态方法没有this 为了帮助区分静态成员和类成员,我在其前面添加了类名。

class Test {
  static Regex TextRegex = new Regex(...);

  public static bool TestString(string input) {
    return Test.TextRegex.IsMatch(input);
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM