实现INotifyPropertyChanged接口时,每次在类中更新属性时,您都要负责调用PropertyChanged事件.
这通常会导致以下代码:
public class MyClass: INotifyPropertyChanged
private bool myfield;
public bool MyField
{
get { return myfield; }
set
{
if (myfield == value)
return;
myfield = value;
OnPropertyChanged(new PropertyChangedEventArgs("MyField"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler h = PropertyChanged;
if (h != null)
h(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
这是每个属性12行.
如果一个人能够装饰这样的自动属性会简单得多:
[INotifyProperty]
public double MyField{ get; set; }
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这是不可能的(例如,请参阅msdn上的这篇文章)
如何减少每个属性所需的代码量?
.net c# automatic-properties inotifypropertychanged .net-3.5
自动属性让我替换此代码:
private MyType myProperty;
public MyType MyProperty
{
get { return myPropertyField; }
}
Run Code Online (Sandbox Code Playgroud)
使用此代码:
public MyType MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在这里和那里进行一些更改 - 但有没有办法替换此代码:
private readonly MyType myProperty;
public MyType MyProperty
{
get { return myPropertyField; }
}
Run Code Online (Sandbox Code Playgroud)
有类似的东西?
我似乎在我的代码中使用了这种模式,我知道它不再是一个简单的Autoproperty,因为它会:
public IList<BCSFilter> BCSFilters { get; set; }
Run Code Online (Sandbox Code Playgroud)
我一直在使用的代码是这样的:
private IList<BCSFilter> _BCSFilters;
/// <summary>
/// Gets or sets the BCS filters.
/// </summary>
/// <value>The BCS filters.</value>
public IList<BCSFilter> BCSFilters
{
get
{
if (_BCSFilters == null)
{
_BCSFilters = new List<BCSFilter>();
}
return _BCSFilters;
}
set
{
_BCSFilters = value;
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以做MainClass.BCSFilters而不用担心需要在消费代码中实例化List.这是一个"正常"模式\正确的方法吗?
我找不到重复的问题
我最近发现了有关自动属性的内容并且非常喜欢它们.此刻我正试图在任何地方使用它们.不仅仅是能够在任何地方使用它们,而是更多地了解它们在大多数情况下的工作情况.
现在我正在做一个单身人士并且想:"嘿,让我们在这里尝试自动属性".
public class MySingleton
{
public static MySingleton MySingleton { get; private set; }
private MySingleton() {}
static MySingleton() { MySingleton = new MySingleton(); }
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:"实现像这样的单身人士是一个好主意吗?"
我不是在问一个单身一般是不是一个好主意.
我想知道以下C#代码:
struct Structure
{
public Structure(int a, int b)
{
PropertyA = a;
PropertyB = b;
}
public int PropertyA { get; set; }
public int PropertyB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它没有编译错误"在将所有字段分配给"之前,不能使用'this'对象.对于类似的类,它正在编译而没有任何问题.
它可以通过重构到以下方式来工作:
struct Structure
{
private int _propertyA;
private int _propertyB;
public Structure(int a, int b)
{
_propertyA = a;
_propertyB = b;
}
public int PropertyA
{
get { return _propertyA; }
set { _propertyA = value; }
}
public int PropertyB
{
get { return _propertyB; …Run Code Online (Sandbox Code Playgroud) 为什么在iOS应用中需要这个下划线前缀?
当我让Visual Studio 2017为我生成属性时,它将始终使用新的表达式 - 身体属性,例如:
private static string username;
internal static string Username { get => username; set => username = value; }
Run Code Online (Sandbox Code Playgroud)
使用这种风格是否有任何优势,或仅仅是偏好和可读性的问题?
internal static string Username { get; set; }
Run Code Online (Sandbox Code Playgroud) 我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该怎么办.
如果我使用自动实现的属性(以下称"aip"),那么我不再需要内部使用的私有支持字段.这很好,因为aip没有副作用.但是如果稍后我需要在get或set中添加一些额外的处理呢?
现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter.这适用于使用该类的外部代码,因为它们不会注意到差异.但是现在所有对aip的内部引用都会在访问属性时调用这些副作用.现在,必须重构对ate aip的所有内部访问才能使用后备字段.
所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您如何看待具有副作用的属性?
我有这样的情况:
public abstract class BaseClass
{
public abstract string MyProp { get; }
}
Run Code Online (Sandbox Code Playgroud)
现在,对于某些派生类,属性值是一个合成值,因此没有setter:
public class Derived1 : BaseClass
{
public override string MyProp { get { return "no backing store"; } }
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,某些派生类需要更传统的后备存储.但是,无论我如何编写它,如在自动属性上,或使用显式的后备存储,我都会收到错误:
public class Derived2 : BaseClass
{
public override string MyProp { get; private set;}
}
public class Derived3 : BaseClass
{
private string myProp;
public override string MyProp
{
get { return myProp;}
private set { myProp = value;}
}
}
Run Code Online (Sandbox Code Playgroud)
Derived2.MyProp.set':无法覆盖,因为'BaseClass.MyProp'没有可覆盖的set访问器
我如何让它工作?
我刚刚创建了一个具有以下属性的iOS类:
@property (nonatomic, strong) NSString* foo;
@property (nonatomic, strong) NSObject* bar;
@property (nonatomic) CGRect fubar;
Run Code Online (Sandbox Code Playgroud)
我没有为这些属性添加任何@synthesize或显式的ivars.然后我进入实现文件并开始创建一个方法如下:
-(void) add
Run Code Online (Sandbox Code Playgroud)
我将光标留在"添加"一词的末尾.然后在代码意义上弹出以下方法名称:
addBar: (NSSet*) objects
addBarObject: (objectType *) object
addFoo: (NSSet*) objects
addFooObject: (objectType *) object
addFubar: (NSSet*) objects
addFubarObject: (objectType *) object
Run Code Online (Sandbox Code Playgroud)
这些方法是什么?他们有什么文件吗?
c# ×8
properties ×5
.net ×3
ios ×2
.net-3.5 ×1
objective-c ×1
readonly ×1
singleton ×1
struct ×1
xcode ×1