标签: automatic-properties

调用INotifyPropertyChanged的PropertyChanged事件的最佳方法是什么?

实现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

10
推荐指数
2
解决办法
8193
查看次数

有没有办法让readonly(不仅仅是私有)自动属性?

自动属性让我替换此代码:

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)

有类似的东西?

c# readonly automatic-properties

10
推荐指数
3
解决办法
1215
查看次数

C#Auto Property - 这种'模式'最佳实践吗?

我似乎在我的代码中使用了这种模式,我知道它不再是一个简单的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.这是一个"正常"模式\正确的方法吗?

我找不到重复的问题

c# design-patterns automatic-properties

10
推荐指数
4
解决办法
4422
查看次数

使用自动属性实现单例是一个好主意吗?

我最近发现了有关自动属性的内容并且非常喜欢它们.此刻我正试图在任何地方使用它们.不仅仅是能够在任何地方使用它们,而是更多地了解它们在大多数情况下的工作情况.

现在我正在做一个单身人士并且想:"嘿,让我们在这里尝试自动属性".

public class MySingleton
{
    public static MySingleton MySingleton { get; private set; }

    private MySingleton() {}

    static MySingleton() { MySingleton = new MySingleton(); }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:"实现像这样的单身人士是一个好主意吗?"

我不是在问一个单身一般是不是一个好主意.

c# singleton automatic-properties

10
推荐指数
2
解决办法
1697
查看次数

自动属性和结构

我想知道以下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)

.net c# struct properties automatic-properties

10
推荐指数
3
解决办法
7515
查看次数

10
推荐指数
1
解决办法
949
查看次数

表达体性与{get; 组;}

当我让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# properties automatic-properties

10
推荐指数
3
解决办法
1万
查看次数

在所有者类中使用属​​性vs后备字段

我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该怎么办.

如果我使用自动实现的属性(以下称"aip"),那么我不再需要内部使用的私有支持字段.这很好,因为aip没有副作用.但是如果稍后我需要在get或set中添加一些额外的处理呢?

现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter.这适用于使用该类的外部代码,因为它们不会注意到差异.但是现在所有对aip的内部引用都会在访问属性时调用这些副作用.现在,必须重构对ate aip的所有内部访问才能使用后备字段.

所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您如何看待具有副作用的属性?

c# properties automatic-properties

9
推荐指数
1
解决办法
6495
查看次数

在C#中将setter添加到虚拟属性

我有这样的情况:

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访问器

我如何让它工作?

.net c# properties automatic-properties

9
推荐指数
1
解决办法
1万
查看次数

iOS - 在codeSense中出现自动合成属性的"添加"方法

我刚刚创建了一个具有以下属性的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)

这些方法是什么?他们有什么文件吗?

xcode properties automatic-properties ios

9
推荐指数
1
解决办法
190
查看次数