【问题标题】:C# Get Set vs Without Get Set [duplicate]C#获取设置与没有获取设置[重复]
【发布时间】:2014-04-25 04:19:17
【问题描述】:

我已经查看了至少 10 个关于 get/set 的 SO 问题,但找不到我的问题。所以我希望这不是重复的。

public class myint
{
    public int value{get;set;}
}

对比

public class myint
{
    public int value;
}

以上两个代码在我看来是一样的。如果我想使用 myint 类,我只需编写下面的代码,它可以在任一类上运行。

myint A;
A.value=10;

那么 get/set 的用途是什么?

【问题讨论】:

  • 在这种情况下,它们只是一个很好的做法。通常,当您有相应属性的后备存储时,您会使用它们。
  • 阅读一本关于 c# 和属性的书。从谷歌开始为什么使用属性。这个问题很基础,有很多答案

标签: c# get set


【解决方案1】:

您问的是使用公共实例变量与我假设的 getter/setter 属性之间有什么区别。

属性允许您进一步封装有关获取或设置变量的逻辑,例如添加简单的验证逻辑。例如,如果有人将您的值设置为小于零,您可能会抛出异常。您还可以在 getter/setter 中添加更多逻辑,例如同步特定字段。

其他一些区别:

  • 可以在大多数 .NET UI 框架中轻松地使用属性进行数据绑定。
  • 反射的工作方式不同。
  • get/set 与实例变量的不同访问级别,例如您可以在只读、私有、受保护、静态等之间进行选择。
  • 访问属性的开销更大。除了游戏和高性能敏感情况之外,这在大多数用例中通常并不重要。

【讨论】:

    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

    属性是提供灵活读取机制的成员, 写入或计算私有字段的值。可以使用属性 好像它们是公共数据成员,但它们实际上是特殊的 称为访问器的方法。这样可以轻松访问数据,并且 仍然有助于提高方法的安全性和灵活性。

    以下是我想到的几件事,可以区分公共 {get;set;} 与公共成员变量:

    1. 数据绑定需要属性。
    2. get 和 set 可以有不同的访问器(例如 public int Value {get; protected set;}
    3. 获取;设置;可以是接口的一部分,例如interface IHasValueGetter { public int Value {get;}}

    What is the difference between a Field and a Property in C#?

    【讨论】:

      【解决方案3】:

      这里是我们什么时候使用get set
      根据MSDN上的属性使用指南:

      • 当成员是逻辑数据成员时使用属性。在以下成员声明中,Name 是一个属性,因为它是一个
        类的逻辑成员。

      在以下情况下使用方法:

      • 操作是一种转换,比如Object.ToString。
      • 该操作的开销太大,以至于您想与用户沟通,让他们考虑缓存结果。
      • 使用 get 访问器获取属性值会产生可观察到的副作用。
      • 连续两次呼叫成员会产生不同的结果。
      • 执行顺序很重要。请注意,类型的属性应该能够以任何顺序设置和检索。
      • 成员是静态的,但返回一个可以更改的值。
      • 该成员返回一个数组。返回数组的属性可能非常具有误导性。通常需要返回一份
        内部数组,以便用户无法更改内部状态。这个,
        再加上用户可以很容易地认为它是索引的事实
        属性,导致代码效率低下。在以下代码示例中,
        每次调用 Methods 属性都会创建一个数组副本。作为一个
        结果,将在下面创建 2n+1 个数组副本
        循环。

      【讨论】:

        【解决方案4】:

        您可以删除 get 并设置它不会影响代码和工作,因为您已经定义了一个 int 类型的变量,其访问类型为 public,因此属性主要用于访问类的私有成员在你的情况下不存在所以继续删除它但是如果在最顶层的类中你定义一个带有 Private 修饰符的变量来访问它获取和设置是必要的属性!

        【讨论】:

          【解决方案5】:
          // This is an example of property...
          public class myint
          {
              public int value{get;set;}
          }
          
          // This is an example of field...
          public class myint
          {
              public int value;
          }
          

          区别:

          • 数据绑定技术仅适用于属性,不适用于字段
          • 字段可用作输出/引用参数的输入。属性可能不会。
          • 属性可能会抛出异常 - 字段永远不会这样做

            例子:

            class Person
            {
               private string _name;
               public string FirstName
               {
                   get
                   {
                       return _name ?? string.Empty;
                   }
                   set
                   {
                       if (value == null)
                          throw new System.ArgumentNullException("value");
                       _name = value;
                   }
               }
            

            }

          • 属性支持 getter/setter 的不同可访问性 - 字段不支持(但字段可以设为只读)

          【讨论】:

            猜你喜欢
            • 2010-11-26
            • 1970-01-01
            • 2013-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多