在实现INotifyPropertyChanged的类中,我经常看到这种模式:
public string FirstName
{
get { return _customer.FirstName; }
set
{
if (value == _customer.FirstName)
return;
_customer.FirstName = value;
base.OnPropertyChanged("FirstName");
}
}
Run Code Online (Sandbox Code Playgroud)
准确的线条
if (value == _customer.FirstName)
return;
Run Code Online (Sandbox Code Playgroud)
困扰我.我经常这样做,但我不确定它是否需要也不好.毕竟,如果调用者分配了相同的值,我不想重新分配该字段,特别是,通知我的订阅者,该属性已经更改,而在语义上它没有.
除了通过释放UI来更新屏幕/ what_medium上可能看起来相同的东西而保存一些CPU/RAM /等,除了我们获得了什么?
有些人可以通过重新分配财产上的相同价值来强制刷新(不是说这会是一个好的做法)吗?
我们应该这样做还是不应该这样做?
为什么?
我搜索了很多关于ObjC访问器和合成访问器的问题都无济于事.这个问题更像是"帮我解决问题"的问题; 我不期待一个答案,但我宁愿寻找专家来衡量这个论点.
在Cocoa Touch类中,我会写一些像这样的代码(其中soundEffects是一个合成的NSArray属性):
id foo = [self.soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
一位同事让我解释为什么上述内容比这一行更好:
id foo = [soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
好吧,功能上,它没有什么不同.
我对前者的论点如下:
self.soundEffects 告诉处理代码的所有其他编码人员,这是一个iVar,而不是本地范围的变量.
如果我们需要,我们可以在soundEffectsgetter访问器中放置自定义逻辑.
没有具体的理由,在Obj-C工作一年后,它"感觉"是正确的做法.
他接受参数#1和#2是有效的,但也给出了对应点:
这不仅仅是代码臃肿吗?
一个类不应该被允许直接与自己的iVars交谈,而不必自己调用方法(getter)吗?
任何接受者?
我在资源包的循环中列出了一个字符串,字段名称列表.我创建一个对象,然后使用循环我想为该对象设置值.例如,对于对象
Foo f = new Foo();
Run Code Online (Sandbox Code Playgroud)
使用参数param1,我有字符串"param1",我想以某种方式将"set"与"set"+"param1"连接起来,然后将其应用于f实例:
f.setparam1("value");
Run Code Online (Sandbox Code Playgroud)
和吸气者一样.我知道反思会有所帮助,但我无法做到.请帮忙.谢谢!
使用swift 4.2我已经开始看到很多问题,其中一个我不确定如何解决,因为我的getter方法应该返回值本身.
我想现在发生的事情是getter将在调用self.type时尝试访问getter
我该如何解决这个问题?
以下是带错误的代码的屏幕截图.
提前致谢
这是书面代码
@objc var type: DecisionType {
set {
if(newValue == DecisionType.DecisionDouble){
//Yes button and NO button should be showing
okButton.isHidden = true;
yesButton.isHidden = false;
noButton.isHidden = false;
}
else {
//Only Ok button should be showing
okButton.isHidden = false;
yesButton.isHidden = true;
noButton.isHidden = true;
}
}
get {
return self.type;
}
};
Run Code Online (Sandbox Code Playgroud) 假设我有一个Ruby类:
class MyClass
def self.property
return "someVal"
end
def self.property=(newVal)
# do something to set "property"
success = true
return success # success is a boolean
end
end
Run Code Online (Sandbox Code Playgroud)
如果我尝试做MyClass.property=x,整个语句的返回值始终为x.许多基于C语言/灵感的语言中的约定是返回布尔"成功"值 - 是否可以使用Ruby中的"equals语法"为setter执行此操作?
此外 - 如果不可能,为什么不呢?允许"等于设定者"操作返回值是否有任何可以想象的缺点?
除了明确清晰,我们为什么要坚持:
car.getSpeed()和car.setSpeed(55)
当这可以作为很好:
car.speed()和car.speed(55)
我知道get()和set()对于通过将所有内容保存在一个地方来保持对数据成员的任何更改都是有用的.
另外,显然,我理解car.speed()并且car.speed(55)是相同的功能,这使得这个错误,但是在PHP和Zend Framework中,相同的操作用于GET,POST和回发.
在VB和C#有"属性",和许多被使用,多少我听说纯粹主义者的厌恶,并有东西在类似于Ruby,5.times和.each,.to_i等
你有操作符重载,多重继承,虚拟函数C++,某些组合可以驱使任何人坚果.
我的意思是说,有太多的范例和方法可以完成任务,似乎没有人尝试过我提到的特定组合.
至于我,我的理由是阅读代码简短而清晰.
我错了,稍微错了,这只是奇怪的,所以不使用,或者还有什么?
如果我仍然决定保持正确,我可以使用car.speed()和car.setSpeed(55).
这有什么不对(只是省略"获取")?
谢谢你的任何解释.
我倾向于假设getter只是一个访问控制包装器,而不是一组相当轻量级的指令来返回一个值(或一组值).
结果,当我发现自己写的时间更长,处理器消耗更多的设置器正在我正在做的时候,我觉得也许这不是最聪明的举动.在我自己的代码中调用getter(特别是让我们引用C#,其中方法与getter调用之间存在语法差异),然后我做出一个隐含的假设,即这些是轻量级的 - 实际上可能不是案件.
对此有何普遍共识?除了使用其他人的图书馆,你会写出沉重的吸气剂吗?或者你倾向于将较重的吸气剂视为"完整方法"?
PS.由于语言的差异,我预计会有很多不同的想法......
看看这段代码.这是一个非常简单的JavaScript对象,它使用Module Pattern实现(你可以看到这个小提琴地址的实例)
var human = function() {
var _firstName = '';
var _lastName = ''
return {
get firstName() {
return _firstName;
}, get lastName() {
return _lastName;
}, set firstName(name) {
_firstName = name;
}, set lastName(name) {
_lastName = name;
}, get fullName() {
return _firstName + ' ' + _lastName;
}
}
}();
human.firstName = 'Saeed';
human.lastName = 'Neamati';
alert(human.fullName);
Run Code Online (Sandbox Code Playgroud)
但是,IE8不支持JavaScript get和set关键字.您可以测试它并查看MDN.
我该怎么做才能使这个脚本与IE8兼容?
javascript getter setter internet-explorer-8 javascript-objects
我正在试图找到一个很好的方法来解决这个问题.我有一个Customer类,它实现了ICustomer接口.该界面中包含许多属性:
public interface ICustomer
{
string FirstName {get; set;}
string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我只希望某些类能够设置这些属性; 即项目中的那些课程.所以我考虑制作二传手internal:
public class Customer : ICustomer
{
string FirstName {get; internal set;}
string LastName {get; internal set;}
}
Run Code Online (Sandbox Code Playgroud)
我想将该setter标记为接口内部,因此不可能有人实现ICustomer,并且程序集之外的人修改这些属性.有没有办法做到这一点?
当我学习Java标准版时,getter和setter函数经常用于隐藏变量并减少对它们的直接访问.有几个消息来源告诉我,在Android中你不应该使用这些函数,只能直接修改变量.原因是在Android中使用getter和setter时,由于开销导致性能下降.导致更多内存使用并减慢系统速度.
有没有道理呢?如果有,为什么使用getter和setter的性能损失?
setter ×10
getter ×7
properties ×5
c# ×3
java ×2
android ×1
car-analogy ×1
internal ×1
javascript ×1
objective-c ×1
oop ×1
reflection ×1
ruby ×1
swift ×1
variables ×1