Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# C语言中有没有简写法可以让一个二传手额外设置一个脏旗_C#_Setter - Fatal编程技术网

C# C语言中有没有简写法可以让一个二传手额外设置一个脏旗

C# C语言中有没有简写法可以让一个二传手额外设置一个脏旗,c#,setter,C#,Setter,目前,为了使setter也能设置a,我必须这样做: private bool _isDirty; private int _lives; public int Lives{ get { return _lives; } set { if (_lives != value){ _lives = value; _isDirty = true; } } } 写起来并不痛苦,但是如果我在我的项目中使

目前,为了使setter也能设置a,我必须这样做:

private bool _isDirty;
private int _lives;
public int Lives{
    get { return _lives; }
    set {
        if (_lives != value){
            _lives = value;
            _isDirty = true;
        }
    }
}
写起来并不痛苦,但是如果我在我的项目中使用了很多这种模式,那么写起来会是一段非常纵向的、大量重复的代码

在C#中有没有简写或其他更简短的语法


我特别想做的是某些变量的更改会触发一个脏标志,在代码的渲染阶段,该标志可用于刷新渲染对象的属性。

否-您可以创建自己的结构来封装此行为,即,一个包含值的通用结构,IsDirty属性和清除标志的方法。

创建一个类,在其中实现帮助器方法

class DirtyClass
{
  protected bool IsDirty { get; set;}

  protected void ChangeProperty<T>(ref T backing, T Value)
  { 
      if(!backing.Equals(value))
      {
           backing = value;
           IsDirty = true;
      }
  }
}
处理空元素只是一个练习


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

如果您不喜欢类的方式,也可以创建一个代码段。 信息:

手动创建代码段:

安装代码段设计器

创建一个代码段并将其命名为propisd(属性快捷方式)


具有脏属性的属性
我自己
创建一个与isDrty关联的属性
propisd


类型
替换为类型
“类型”
私名
替换为私有名称
“私有名称”
属性名称
替换为属性名
“PROPERTYNAME”
将此文件另存为propisd.snippet,并通过代码段管理器添加它


无论何时键入propisd,后跟TAB,都会看到代码段。通过使用Tab,您将完成替换。就像你会键入“道具”,然后执行TAB。

也许Postsharp和AOP可能是一个选项。它清晰易懂,并且能满足你的需要,不是吗?专注于你真正的问题。。。如果你发现自己一次又一次地编写代码,你应该把它重构成一个自己的方法。这不是一个完美的解决方案,但如果有足够多的争论和反思,它可以让你进入一行之地。您可以使用相同的概念来应用于此。@HimBromBeere“如果我在项目中大量使用此模式,则需要编写重复的代码。”可以说,如果在整个项目中重复多次,这将是一个问题。@HimBromBeere:您的
SetValue
调用可以通过
CallerMemberName
属性简化,因此setter不需要传入其名称。处理null元素只是一个练习。使用而不是backing.Equals。如果实例不为null,则处理null值并转发给Equals。可能可以选择将方法的名称更改为
ChangeField
,因为它不会更改属性。我喜欢这种实施行为的方式。使用这种方式添加INotifyPropertyChanged将非常容易。
class LivesCounter : DirtyClass
{
   private int _lives;
   public int Lives  
   {
      get { return _lives; }
      set { ChangeProperty(ref _lives, value); }
   }
}
<?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>