在c#中有什么捷径可以让setter额外设置一个脏标志吗?

本文关键字:设置 一个 标志 外设 什么 捷径 setter | 更新日期: 2023-09-27 18:14:08

目前,为了让setter也设置一个dirty属性,我必须这样做:

private bool _isDirty;
private int _lives;
public int Lives{
    get { return _lives; }
    set {
        if (_lives != value){
            _lives = value;
            _isDirty = true;
        }
    }
}

这不是一个巨大的痛苦编写,但它是一个非常垂直的空间和重复的代码块,如果我在我的项目中使用了很多这种模式。

在c#中是否有更短的语法来做这件事?

我特别想完成的是某些变量的变化应该触发一个脏标志,在代码的呈现阶段可以用来刷新所呈现对象的属性。

在c#中有什么捷径可以让setter额外设置一个脏标志吗?

创建一个类,在其中实现一个helper方法。

class DirtyClass
{
  protected bool IsDirty { get; set;}
  protected void ChangeProperty<T>(ref T backing, T Value)
  { 
      if(!backing.Equals(value))
      {
           backing = value;
           IsDirty = true;
      }
  }
}

在setter

中使用helper方法
class LivesCounter : DirtyClass
{
   private int _lives;
   public int Lives  
   {
      get { return _lives; }
      set { ChangeProperty(ref _lives, value); }
   }
}

处理null元素留作练习。

正如jdl134679所提到的,查看INotifyPropertyChanged接口。

如果您不喜欢类的方式,您也可以创建一个代码片段。信息:https://msdn.microsoft.com/en-us/library/ms165396.aspx

手工创建一个代码片段:https://msdn.microsoft.com/en-us/library/ms165394.aspx

安装代码段设计器https://visualstudiogallery.msdn.microsoft.com/B08B0375-139E-41D7-AF9B-FAEE50F68392

创建一个代码片段并命名为propd(属性快捷方式)

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
    xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Properties with Dirty</Title>
            <Author>Myself</Author>
            <Description>Creates a property which ties to isDrty</Description>
            <Shortcut>propisd</Shortcut>
        </Header>
        <Snippet>
            <Code Language="C#">
                <![CDATA[private $TYPE$ $PRIVATENAME$;
                    public $TYPE$ $PROPERTYNAME$
                    {
                        get { return $PRIVATENAME$; }
                        set 
                        {
                            if ($PRIVATENAME$ != value)
                            {
                                $PRIVATENAME$ = value;
                                _isDirty = true;
                            }
                        }
                    }]]>
            </Code>
            <Declarations>
                <Literal>
                    <ID>TYPE</ID>
                    <ToolTip>replace with the type</ToolTip>
                    <Default>"TYPE"</Default>
                </Literal>
                <Literal>
                    <ID>PRIVATENAME</ID>
                    <ToolTip>replace with the private name</ToolTip>
                    <Default>"PRIVATENAME"</Default>
                </Literal>
                <Literal>
                    <ID>PROPERTYNAME</ID>
                    <ToolTip>replace with the property name</ToolTip>
                    <Default>"PROPERTYNAME"</Default>
                </Literal>
            </Declarations>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

按要求保存此文件。代码段,并通过代码段管理器添加。

无论何时键入propd后跟TAB,都将看到该代码片段。通过使用Tab键,您将完成替换。比如你会输入'prop'然后按TAB键

不可以——您可以创建自己的结构来封装这种行为,例如:一个泛型结构,包含一个值、一个IsDirty属性和一种清除标志的方法。