我现在正在上C#课程,我正在努力寻找最好的做事方式.我来自Java背景,因此我只熟悉Java最佳实践; 我是C#新手!
在Java中,如果我有私有财产,我会这样做;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
Run Code Online (Sandbox Code Playgroud)
在C#中,我看到有很多方法可以做到这一点.
我可以像Java一样做:
private string name;
public void setName(string name) {
this.name = name;
}
public string getName() {
return this.name;
}
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做:
private string name;
public string Name {
get { return name; }
set { name = value; }
}
Run Code Online (Sandbox Code Playgroud)
要么:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
我应该使用哪一个,每种方法涉及哪些警告或细微之处?在创建类时,我遵循我从Java中了解的一般最佳实践(特别是阅读Effective Java).因此,例如,我赞成不变性(仅在必要时提供setter).我很想知道这些实践如何适应C#中提供setter和getter的各种方法; 基本上,我如何将Java世界的最佳实践转换为C#?
编辑
我发布这篇文章是对Jon Skeet答案的评论,但后来很久了:
那么一个非平凡的财产(也许,可能有重要的处理和验证)?我是否仍然可以通过公共属性公开它,但是逻辑封装在get和 …
我不明白是否需要拥有以C#2开头的私人制定者.
为我设置一个setter方法是让用户在该类中设置一些变量.在这样做时,我们不会将变量直接暴露给用户.相反,我们让他们通过这种公共setter方法来做到这一点.
这对我来说是使用"封装".有一些争论声称私人制定者会允许你应用封装.
我是不是通过使用公共setter方法使用封装?为什么我们需要私人制定者?
不可变类和具有私有setter的类有什么区别?
在我的 .net core 3.1 应用程序中,我想将属性封装在某个实体中:
public class Sample : AuditableEntity
{
public Sample(string name)
{
Name = name;
}
public int Id { get; }
public string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)
因此,我删除了所有公共设置器,因此当我想检查此类 Sample 是否已存在时,我的代码中的某个位置
_context.Samples.Any(r => r.Name == name)
Run Code Online (Sandbox Code Playgroud)
该行导致错误:System.InvalidOperationException: 'No suitable constructor found for entity type 'Sample'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'name' in 'Sample(string name)'.'。
所以我添加了代码空构造函数
public class Sample : AuditableEntity
{ …Run Code Online (Sandbox Code Playgroud) .net c# entity-framework-core .net-core entity-framework-core-3.1