"非原子"在此代码中的含义是什么?
@property(nonatomic, retain) UITextField *theUsersName;
Run Code Online (Sandbox Code Playgroud)
原子和非原子有什么区别?
谢谢
我有这个网站源代码的摘录:
<meta content="This is a basic text" property="og:title" />
Run Code Online (Sandbox Code Playgroud)
这个属性属性代表什么,它的目的是什么?
为什么不允许使用以下C#代码:
public abstract class BaseClass
{
public abstract int Bar { get;}
}
public class ConcreteClass : BaseClass
{
public override int Bar
{
get { return 0; }
set {}
}
}
Run Code Online (Sandbox Code Playgroud)
CS0546'ConcreteClass.Bar.set':无法覆盖,因为'BaseClass.Bar'没有可覆盖的set访问器
我意识到它似乎是C#中字段和属性之间有什么区别的重复?但我的问题略有不同(从我的观点来看):
一旦我知道了
是否有任何区别(风格/未来发展除外),如设置属性时的某种控制类型?
是否有任何额外的区别:
public string MyString { get; set; }
Run Code Online (Sandbox Code Playgroud)
和
public string myString;
Run Code Online (Sandbox Code Playgroud)
(我知道,第一个版本需要C#3.0或更高版本,并且编译器会创建私有字段.)
我有一个抽象基类,我想声明一个字段或属性,在每个继承自此父类的类中具有不同的值.
我想在基类中定义它,所以我可以在基类方法中引用它 - 例如重写ToString来说"这个对象是属性/字段类型".我有三种方法可以看到这样做,但我想知道 - 这样做的最佳或可接受的方式是什么?新手问题,抱歉.
选项1:
使用抽象属性并在继承的类上覆盖它.这得益于强制执行(你必须覆盖它)并且它是干净的.但是,返回硬代码值而不是封装字段感觉有点不对,而且它只是几行代码而不仅仅是.我还必须为"集合"声明一个主体,但这不太重要(并且可能有一种方法可以避免我不知道的情况).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Run Code Online (Sandbox Code Playgroud)
选项2
我可以声明一个公共字段(或受保护的字段),并在继承的类中显式覆盖它.下面的例子会给我一个使用"new"的警告,我可能会这样做,但它感觉不对,它打破了多态性,这是重点.看起来不是一个好主意......
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Run Code Online (Sandbox Code Playgroud)
选项3
我可以使用受保护的字段并在构造函数中设置值.这看起来很整洁,但依赖于我确保构造函数始终设置这个并且使用多个重载构造函数总是有可能某些代码路径不会设置该值.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{ …
Run Code Online (Sandbox Code Playgroud) 我对如何@property
在Python中使用感兴趣.我已经阅读了python文档和那里的例子,在我看来,它只是一个玩具代码:
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
Run Code Online (Sandbox Code Playgroud)
我不知道从包装_x
填充属性装饰器可以获得什么好处.为什么不实施为:
class C(object):
def __init__(self):
self.x = None
Run Code Online (Sandbox Code Playgroud)
我认为,属性功能在某些情况下可能会有用.但当?有人可以给我一些现实世界的例子吗?
谢谢.
我们使用下面的代码为Spring bean注入属性文件中的属性.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:/my.properties"/>
</bean>
<bean id="blah" class="abc">
<property name="path" value="${the.path}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
有没有办法以编程方式访问属性?我正在尝试做一些没有依赖注入的代码.所以我想要一些像这样的代码:
PropertyPlaceholderConfigurer props = new PropertyPlaceholderConfigurer();
props.load("classpath:/my.properties");
props.get("path");
Run Code Online (Sandbox Code Playgroud) 如何根据字符串获取PHP中的属性?我会叫它magic
.那是什么magic
?
$obj->Name = 'something';
$get = $obj->Name;
Run Code Online (Sandbox Code Playgroud)
就像......
magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
Run Code Online (Sandbox Code Playgroud) 我最近尝试编译一个较旧的Xcode项目(曾经编译得很好),现在我看到了很多这种形式的错误:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
导致这些错误的代码模式总是如下所示:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Run Code Online (Sandbox Code Playgroud)
我可以看到为什么会生成错误.我告诉编译器合成我的属性访问器(getter和setter),然后立即手动覆盖setter.那段代码总是闻到一点点气味.
那么,这样做的正确方法是什么?如果我使用@dynamic
而不是@synthesize
,我将不得不写入getter.这是唯一的方法吗?
快速提问:您何时决定使用属性(在C#中)以及何时决定使用方法?
我们正在忙着进行这场辩论,并且发现了一些我们应该使用财产或方法存在争议的领域.一个例子是:
public void SetLabel(string text)
{
Label.Text = text;
}
Run Code Online (Sandbox Code Playgroud)
在该示例中,Label
是ASPX页面上的控件.是否有一个原则可以控制决策(在这种情况下)是否将其作为方法或财产.
我会接受最全面和最全面的答案,但这也触及了我给出的例子.