【问题标题】:Why keep two variables for one content in C# UWP?为什么在 C# UWP 中为一个内容保留两个变量?
【发布时间】:2018-06-07 12:17:33
【问题描述】:

在 C# 中,我注意到许多编码人员会执行以下操作:

class X
{
    private int test_;

    public int test
    {
        get { return test_; }
        set { if (test_ != value) test_ = value; }
    }
}

我的问题是为什么要为相同的内容保留一个私有变量和一个公共变量?

为什么我们不这样做呢?

class X
{
    public int test
    {
        get; set;
    }
}

我的意思是,无论如何我们都在更改私有变量。不使用单个公共变量有什么意义?

【问题讨论】:

    标签: c# uwp windows-10-universal


    【解决方案1】:

    代码:

    class X
    {
        public int test
        {
            get; set;
        }
    }
    

    ...与此直接等价:

    class X
    {
        private int test_;
    
        public int test
        {
            get { return test_; }
            set { test_ = value; }
        }
    }
    

    第一个例子是一个自动实现的属性。 C# 编译器会在您编译时自动生成第二个示例。

    现在,您首先提供的代码虽然有这行:

    set { if (test_ != value) test_ = value; }
    

    您会注意到它所做的与自动属性等效代码不同。这就是这两种方法的不同之处。

    当您为属性使用支持字段时,您可以引入需要您的代码遵循的特定规则。

    例如,您可能想在音乐应用上设置音量,因此您的代码可能是这样的:

    public class Music
    {
        private int _volume = 7;
    
        public int Volume
        {
            get { return _volume; }
            set
            {
                if (value >= 0 && value <= 10)
                {
                    _volume = value;
                }
            }
        }
    }
    

    当您的属性包含这样的逻辑时,通常会有一个私有字段变量。

    【讨论】:

    • 但如果是琐事:编译器不保证任何关于给定属性的支持字段的名称。但是,是的,它几乎总是只有一个下划线之类的。
    • @cwharris - 你是对的。事实上,它经常被赋予一个非法的 C# 名称以避免与实际变量发生冲突。
    • @cwharris - 事实上,第一个示例将其作为支持字段:private int &lt;test&gt;k__BackingField;。是的,&lt;test&gt; 是名称的一部分——它是非法的 C#,但对 IL 来说完全没问题。
    • 哇,我不记得它为那些疯狂的东西命名了。再说一次,我最后一次检查是在 5 年前。这表明他们对没有保证是认真的。谢谢,通过 C# 的 CLR,提供更多有趣的实现细节——即使我永远不需要知道它们中的任何一个。
    【解决方案2】:

    这不是两个变量。一个是字段,另一个是属性。属性是变相的可选 getter 和 setter 方法。

    您提出的解决方案实际上是语言的一部分,称为自动实现的属性: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties

    【讨论】:

    • 请在您的答案中定义“自动实现的属性”。链接只能用于支持您的答案中的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多