Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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
C#只读变量的Objective-C等价物_C#_Ios_Objective C_Cocoa_Readonly - Fatal编程技术网

C#只读变量的Objective-C等价物

C#只读变量的Objective-C等价物,c#,ios,objective-c,cocoa,readonly,C#,Ios,Objective C,Cocoa,Readonly,在C#中,我们可以将实例变量声明为readonly,以指定它只能在声明期间或在其所属类的构造函数中作为赋值的主题: private readonly int _myInt; 在Objective-C中,我理解属性可以声明为只读,因此: @property (readonly) int myInt; 但是,这相当于具有私有集访问器的C#属性,并且不保护相应的实例变量在初始化后“私有”重新分配 有没有一种方法可以模仿Objective-C中C#的readonly修饰符的行为,使得实例变量只能在其

在C#中,我们可以将实例变量声明为
readonly
,以指定它只能在声明期间或在其所属类的构造函数中作为赋值的主题:

private readonly int _myInt;
在Objective-C中,我理解属性可以声明为只读,因此:

@property (readonly) int myInt;
但是,这相当于具有私有
访问器的C#属性,并且不保护相应的实例变量在初始化后“私有”重新分配

有没有一种方法可以模仿Objective-C中C#的
readonly
修饰符的行为,使得实例变量只能在其包含类的初始值设定项中赋值(注意-因为我希望能够在类初始值设定项中赋值给变量,
const
修饰符不适合我的需要)?


如果这是不可能的,那么在Objective-C中这种行为不合适有什么概念上的原因吗?

Objective-C最终是一种基于C的、指针丰富的语言。因此,一旦您有了指向任何给定对象实例的指针,您就可以非常直接地随心所欲地进入并处理对象状态。如果没有VM或其他安全地在进程中强制执行只读内存的机制,任何这样的机制都可能失败

因此,Objective-C很久以前就选择简单而不是错误的安全感

如果不做一些非常卑鄙的事情,就不能从类外重置
只读
@属性
的备份存储的值;调用未在类的公共
@接口
中声明的方法,扰乱运行时API,或者其他更糟糕的事情

因此,归根结底,这些特性并没有被追求,因为这样做会消耗大量的工程人员,不会真正增加语言的安全性,并且会使语言本身更加复杂(需要记住额外的关键字和规则)


相关的,请看这个问题/答案:

这是一句很棒的话:Objective-C很久以前就选择了简单而不是错误的安全感。