Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getter、setter和properties最佳实践。Java与C#_C#_Java_Properties_Getter Setter - Fatal编程技术网

getter、setter和properties最佳实践。Java与C#

getter、setter和properties最佳实践。Java与C#,c#,java,properties,getter-setter,C#,Java,Properties,Getter Setter,我现在正在上一门C#类课程,我正在努力找出做事情的最佳方式。我来自Java背景,因此我只熟悉Java最佳实践;我是个新手 在Java中,如果我有私有财产,我会这样做 private String name; public void setName(String name) { this.name = name; } public String getName() { return this.name; } 在C#中,我看到有很多方法可以做到这一点 我可以像Java那样做: pr

我现在正在上一门C#类课程,我正在努力找出做事情的最佳方式。我来自Java背景,因此我只熟悉Java最佳实践;我是个新手

在Java中,如果我有私有财产,我会这样做

private String name;

public void setName(String name) {
   this.name = name;
}

public String getName() {
   return this.name;
}
在C#中,我看到有很多方法可以做到这一点

我可以像Java那样做:

private string name;

public void setName(string name) {
   this.name = name;
}

public string getName() {
   return this.name;
}
或者我可以这样做:

private string name;

public string Name {
   get { return name; }
   set { name = value; }
}
或:

我应该使用哪种方法,每种方法都有哪些注意事项或微妙之处?在创建类时,我遵循从Java中了解到的一般最佳实践(特别是阅读有效的Java)。例如,我支持不变性(仅在必要时提供setter)。我只是想看看这些实践如何与C#中提供二传手和传接手的各种方式相适应;从本质上讲,我如何将Java世界的最佳实践转化为C#

编辑

我将此作为对Jon Skeet回答的评论发布,但后来它变长了:


那么一个非平凡的属性(即,可能具有重要的处理和验证)呢?我是否仍然可以通过公共属性公开它,但逻辑封装在
get
set
中?为什么我会/应该在使用专用的setter和getter方法(以及相关的处理和验证逻辑)的情况下这样做呢。您将使用单独的getter和setter方法获得backinng变量。通过使用属性,您遵循的是最佳实践,因此问题在于您希望得到的详细程度

就我个人而言,我会选择auto属性,最新版本:
public string Name{get;set;}
,因为它们占用的空间最少。如果将来需要添加验证之类的内容,您可以随时扩展这些功能。

Pre-C#6

我会用最后一个,作为一个微不足道的财产。注意,我将其称为公共属性,因为getter和setter都是公共的

不变性对于自动实现的属性来说有点麻烦——你不能编写一个只有getter的自动属性;您能到达的最近距离是:

public string Foo { get; private set; }
这并不是一成不变的。。。在你的课堂之外是不变的。因此,您可能希望使用真正的只读属性:

private readonly string foo;
public string Foo { get { return foo; } }
您肯定不想编写
getName()
setName()
。在某些情况下,编写Get/Set方法而不是使用属性是有意义的,特别是如果它们可能很昂贵并且您希望强调这一点的话。但是,对于方法,您可能希望遵循PascalCase的.NET命名约定,并且无论如何也不希望用普通方法实现这样一个微不足道的属性——这里的属性更为惯用

C#6

万岁,我们终于有了正确的只读自动实现属性:

// This can only be assigned to within the constructor
public string Foo { get; }
public double Area => height * width;
同样,对于确实需要执行某些操作的只读属性,可以使用成员体属性:

// This can only be assigned to within the constructor
public string Foo { get; }
public double Area => height * width;
在C#中使用属性,而不是get/set方法。他们在那里是为了方便你,这是惯用的


至于你的两个C#示例,一个只是另一个的语法糖。使用auto属性如果您只需要一个简单的实例变量包装器,那么当您需要在getter和/或setter中添加逻辑时,请使用完整版本。

只要可能,我更喜欢public
string Name{get;set;}
,因为它简洁易读。然而,有时这一点是必要的

private string name;

public string Name {
   get { return name; }
   set { name = value; }
}
在C#中,偏爱用于为get和/或set公开私有字段的属性。您提到的表单是一个自动属性,其中get和set会自动为您生成一个隐藏的pivot backing字段

如果可能的话,我倾向于使用自动属性,但不应该在C#中使用set/get方法对

这只是一个简单的属性,技术上与普通属性相同。编译时将创建备份字段

所有属性最终都会转换为函数,因此最终实际编译的实现与您在Java中使用的实现相同


当您不必对备份字段执行特定操作时,请使用自动实现的属性。以其他方式使用普通属性。当操作有副作用或计算开销较大时,请使用get和set函数,否则请使用properties。

如前所述,所有这些方法都会产生相同的结果。最重要的是你选择一个惯例并坚持下去。我更喜欢使用最后两个属性示例。

在C中,首选的方法是通过属性,而不是通过
getX()
setX()
方法。另外,请注意,C#不要求属性同时具有get和set-您可以具有get-only属性和set-only属性

public boolean MyProperty
{
    get { return something; }
}

public boolean MyProperty
{
    set { this.something = value; }
}

首先让我试着解释一下你写了什么:

// private member -- not a property
private string name;

/// public method -- not a property
public void setName(string name) {
   this.name = name;
}

/// public method -- not a property
public string getName() {
   return this.name;
}

// yes it is property structure before .Net 3.0
private string name;
public string Name {
   get { return name; }
   set { name = value; }
}
这种结构现在也被使用,但如果您想做一些额外的功能,它是最合适的,例如,当一个值被设置时,您可以将其解析为大写,并将其保存在私有成员中以供内部使用

使用.net framework 3.0

// this style is introduced, which is more common, and suppose to be best
public string Name { get; set; }

//You can more customize it
public string Name
{
    get;
    private set;    // means value could be set internally, and accessed through out
}

如果您只需要一个变量来存储一些数据,祝您在C#

中好运:

public string Name { get; set; }
要使其显示为只读吗

public string Name { get; private set; }
或者更好

private readonly string _name;

...

public string Name { get { return _name; } }
要在指定属性之前进行一些值检查吗

public string Name 
{
   get { return m_name; }
   set
   {
      if (value == null)
         throw new ArgumentNullException("value");

      m_name = value;
   }
}
一般来说,GetXyz()和SetXyz()只在某些情况下使用,你只需要在感觉合适的时候使用直觉。一般来说,我希望大多数get/set属性不包含太多的逻辑,并且只有很少的(如果有的话)意外副作用。如果读取属性值需要调用服务或从用户处获取输入以构建我请求的对象,那么我会将其包装到一个方法中,并将其称为
BuildXyz()
,而不是像大多数answ一样
GetXyz()

[DataMember(Name="aMoreFriendlyName")]
public string Name { get; set; }
/*this is invalid*/
public string Name 
{ 
    get; 
   /* setter omitted to prove the point*/
}
obj.getItems(filter);
obj.items
obj.itemsFilteredByX
obj.itemsFilteredByY