相关疑难解决方法(0)

吸气剂,制定者和属性最佳实践.Java与C#

我现在正在上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# java properties getter-setter

90
推荐指数
6
解决办法
8万
查看次数

了解私人制定者

我不明白是否需要拥有以C#2开头的私人制定者.

为我设置一个setter方法是让用户在该类中设置一些变量.在这样做时,我们不会将变量直接暴露给用户.相反,我们让他们通过这种公共setter方法来做到这一点.

这对我来说是使用"封装".有一些争论声称私人制定者会允许你应用封装.

我是不是通过使用公共setter方法使用封装?为什么我们需要私人制定者?

不可变类和具有私有setter的类有什么区别?

c#

82
推荐指数
5
解决办法
9万
查看次数

没有 setter 的 Entity Framework Core 属性

在我的 .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

7
推荐指数
1
解决办法
6289
查看次数