我现在正在上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和 …
使用get/set似乎是Java中的常见做法(出于各种原因),但我几乎看不到使用它的Python代码.
为什么在Python中使用或避免使用get/set方法?
public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
Run Code Online (Sandbox Code Playgroud)
在Learn C++上,他们表示会跑得更快.所以,我认为在getter和setter上使用它会很棒.但也许,它有一些缺点吗?
在我的班级中更改我的getter方法(如版本2)是不好的做法.
版本1:
public String getMyValue(){
return this.myValue
}
Run Code Online (Sandbox Code Playgroud)
版本2:
public String getMyValue(){
if(this.myValue == null || this.myValue.isEmpty()){
this.myValue = "N/A";
}
return this.myValue;
}
Run Code Online (Sandbox Code Playgroud) 我已经在C#中编程了一段时间,现在我想要提高我的C++技能.
上课:
class Foo
{
const std::string& name_;
...
};
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法(我只想允许对name_字段的读访问):
inline const std::string& name() const { return name_; }谢谢.
我需要知道如何让NetBeans使用快捷方式生成getter和setter.
有没有办法在TypeScript中为属性设置私有的setter?
class Test
{
private _prop: string;
public get prop() : string
{
return this._prop;
}
private set prop(val: string)
{
//can put breakpoints here
this._prop = val;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨getter和setter的可见性不匹配.我知道我可以设置支持字段,但是当设置值时我不能设置断点.
我虽然使用接口来隐藏setter,但是接口只能定义一个属性,而不是它是否在setter上有getter.
我在这里错过了什么吗?似乎没有任何理由不允许私有的setter,结果JS不会强制执行可见性,并且似乎比当前的替代品更好.
我错过了什么吗?如果不是,没有私人制定者的充分理由?
我对Swift中有关var的使用和关键字{get set}的协议有疑问.
来自Apple文档:
如果协议要求属性可获取和可设置,则不能通过常量存储属性或只读计算属性来满足该属性要求.如果协议只要求属性可以获取,那么任何类型的属性都可以满足要求,如果这对您自己的代码有用,则该属性也可以设置.
属性要求始终声明为变量属性,前缀为var关键字.Gettable和settable属性通过在类型声明后写入{get set}来指示,并且通过编写{get}来指示gettable属性.
我无法理解为什么我不能使用let.只有get的协议中的var不只是一个let?
像这样的东西:
protocol someProtocol
{
var someProperty: String { get }
}
Run Code Online (Sandbox Code Playgroud)
它不会只是:
protocol someProtocol
{
let someProperty: String
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
例如,在Java中,我可以自己编写getter(由IDE生成)或者在lombok中使用@Getter之类的注释 - 这非常简单.
然而,Kotlin 默认拥有getter和setter.但我无法理解如何使用它们.
我想说,就像Java一样:
private val isEmpty: String
get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.
Run Code Online (Sandbox Code Playgroud)
那么吸气剂如何工作?
我们有一些带有@Column和的注释的Hibernate getter方法@Basic.
如果我们没有相应的setter,我们会得到一个例外.为什么是这样?
在我们的例子中,我们导出从getter返回的值(以存储在DB中),并且setter没有功能目的.所以我们只有一个空方法来解决错误情况.
getter-setter ×10
java ×3
c++ ×2
accessor ×1
c# ×1
class ×1
coding-style ×1
hibernate ×1
inline ×1
ios ×1
kotlin ×1
lazy-loading ×1
netbeans ×1
performance ×1
properties ×1
protocols ×1
python ×1
setter ×1
swift ×1
typescript ×1