C#带有Get Set和不带Get Set的区别

8

我查看了至少10个与get/set相关的SO(Stack Overflow)问题,但没有找到我的问题。因此,我希望这不是重复的。

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

vs

public class myint
{
    public int value;
}

上述两个代码对我来说看起来是一样的。如果我想使用myint类,我只需编写下面的代码即可在任何一个类上运行。
myint A;
A.value=10;

那么get/set有什么用途呢?

在这种情况下,它们只是一种好的实践方法。通常,当您有相应属性的后备存储时,才会使用它们。 - bit
阅读一本关于C#和属性的书。从Google了解为什么要使用属性开始。这个问题很基础,有很多答案。 - ilansch
5个回答

2
您正在询问使用公共实例变量与getter/setter属性之间的区别,我想是吗?
属性允许您进一步封装获取或设置变量的逻辑,例如添加简单的验证逻辑。例如,如果某人将您的值设置为小于零,您可以抛出异常。您还可以在getter/setter中添加其他逻辑,例如同步特定字段。
还有一些其他差异:
  • 在大多数.NET UI框架中,属性可以轻松用于数据绑定。
  • 反射的工作方式不同。
  • 对于get/set和例如实例变量,您可以选择整体的readonly、private、protected、static等不同访问级别。
  • 访问属性时会有更多开销。除了游戏和高性能敏感情况外,在大多数情况下这通常不重要。

1

以下是何时使用get set:
根据MSDN上的属性使用指南:

当成员是逻辑数据成员时,请使用属性。在以下成员声明中,Name是一个属性,因为它是类的逻辑成员。
当满足以下条件时,请使用方法: - 操作是转换,例如Object.ToString。 - 操作太昂贵,您希望向用户传达他们应该考虑缓存结果。 - 使用get访问器获取属性值会产生可观察的副作用。 - 连续两次调用成员会产生不同的结果。 - 执行顺序很重要。请注意,类型的属性应该能够以任何顺序设置和检索。 - 成员是静态的,但返回可以更改的值。 - 该成员返回一个数组。返回数组的属性可能非常误导人。通常需要返回内部数组的副本,以便用户无法更改内部状态。这个事实再加上用户很容易假设它是一个索引属性,会导致低效的代码。在以下代码示例中,每次调用Methods属性都会创建数组的副本。因此,在下面的循环中将创建2n+1个数组的副本。

1

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

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

以下是我脑海中区分公共{get;set;}与公共成员变量的几个事项:

  1. 属性对于数据绑定是必需的。
  2. get和set可以拥有不同的访问器(例如,public int Value {get; protected set;})。
  3. get;set;可以成为接口的一部分,例如:interface IHasValueGetter { public int Value {get;}}

在C#中,字段和属性有什么区别?


0

你可以移除 get 和 set,这不会影响代码和工作,因为你已经定义了一个类型为 int 的变量,并将其访问类型设置为 public,所以属性通常用于访问类的私有成员,而在你的情况下不存在,因此继续移除它。但是,如果在最顶层的类中使用 Private 修饰符定义变量,则需要使用 get 和 set 属性来访问它!


0
// 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;
}

区别:

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

    例如:

    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可访问性 - 字段不支持(但字段可以设置为只读)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接