【问题标题】:What does this code do in c# and what is it's purpose?这段代码在 c# 中做了什么,它的目的是什么?
【发布时间】:2011-07-21 21:58:58
【问题描述】:
 public class A {
    public Par mParams;
    public Par Parameters {
        get { return mParams; }
        set { mParams = value; }
    }
}

我是 C# 新手

public Par Parameters 是什么?这似乎既不是一个类也不是一个函数。在这里感到困惑。

【问题讨论】:

  • 顺便说一句,您通常使用 mParams private,因为您不想公开您的成员变量并使用属性公开它们。在较新的 .NET 版本中,您可以使用类似于 public Par Parameters { get; set; } 的称为自动实现属性的东西,而无需 mParams

标签: c# .net properties


【解决方案1】:

把它想象成 Java 中的 public Par getParameters()public void setX(Par p) 方法。因此,它最接近“函数”,但实际上称为属性。你可以这样使用它:

A myObject = new A();
a.Parameters = new Par(...);

这是一个由公共字段支持的属性,在这种情况下,它有些多余,mParms 应该声明为protectedprivate

我建议您在属性上查看此MSDN Programming Guide。它很好地解释了它们的工作原理以及它们的用途。

【讨论】:

  • @David Degea - 不要忘记接受 Nate 的回答(或者你选择的任何人,但我认为 Nate 给出了最完整和简洁的答案)。
【解决方案2】:

Public Par Parameters 的代码块是一个属性

我怀疑public Par mParams; 这行实际上应该是私有的。它是存储属性值的底层变量。

值得指出的是,您在 C# 中不再明确需要 mParams。您可以定义一个自动属性,编译器使用以下方法创建自己的底层私有变量:

Public Par Parameters { get; set; }

【讨论】:

  • 同意-不是我的最佳答案-我已经改进了它,但为时已晚:-(
【解决方案3】:

public Par Parameters是一个属性,用于设置或获取mParams的值。

【讨论】:

    【解决方案4】:

    ParametersProperty 类型的 Par。它有一个access modifier (public),这意味着它可以从代码中的任何位置访问。

    您的示例有点多余,因为 mParams field 实际上是可公开访问的,并且公开它的属性除了返回和设置字段之外没有任何作用。但是,您可能会在每个“访问器”(get 和 set 位)中添加额外的代码。例如进行验证、通知某个属性已更改等。

    您使用属性的方式与使用字段的方式非常相似:

    A foo = new A();
    
    // Calls the "get" accessor of the Parameters property
    if (foo.Parameters == null)
    {
        // Calls the "set" accessor of the Parameters property
        foo.Parameters = new Par();
    }
    

    不允许从类外部直接访问成员字段(变量)被认为是最佳实践。因此,在典型情况下,该字段应该是私有的(或有时是受保护的):

    private Par mParams;
    
    public Par Parameters
    {
        get { return mParams; }
        set { mParams = value; }
    }
    

    您还想了解一些略有不同的语法。首先是auto-implemented property

    public Par Parameters
    {
        get;
        set;
    }
    

    对于自动实现的属性,C# 编译器会自动为您生成一个支持字段。如果我们的属性 getter 和 setter 不需要包含任何逻辑,这可以避免您编写一些代码。

    您还可以使用属性来限制访问,以通过字段无法实现的方式:

    public Par Parameters
    {
        get;
        private set;
    }
    

    注意set "accessor" 有它自己的访问修饰符。结果是一个公开可读的属性,但只允许类本身设置它。这类似于:

    private Par mParams;
    
    public Par Parameters
    {
        get { return mParams; }
    }
    

    这实际上做同样的事情,但没有自动实现的属性。

    在不支持属性的语言中,所有这些都可以通过创建两个methodsGetParametersSetParameters 来实现。事实上,C# 编译器会在后台生成一些名称非常相似的方法。

    【讨论】:

      【解决方案5】:

      它是访问器和修改器的简写。再举一个例子:

      private int i = 0;
      public int myNumber {
          get { return i; }
          set { i = value; }
      }
      

      允许您更改变量i。就像在代码中一样:

      className.myNumber = 20;
      // className.i is now 20
      

      【讨论】:

      • 在解释发生了什么方面做得很合理,但你忘了提到它们被称为属性:)
      【解决方案6】:

      这是一个property,它的工作方式非常类似于一对方法(函数),其唯一目的是让您访问mParams 字段。作为syntactic sugar 的一部分,C# 使您能够像分配变量一样分配和读取它。把它想象成两个方法,getParameterssetParameters,你不能直接调用,但是当你访问Parameters 时会调用它们。

      Parameters = new Par(); //Works as though you had run: setParameters(new Par());
      Par x = Parameters;     //Works as though you had run: Par x = getParameters();
      

      这使您可以使用更短、更方便且更具表现力的类变量语法,但您实际上正在运行由编译器创建的两个“不可见”方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-01
        • 2018-08-09
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多