C# C语言中有没有简写法可以让一个二传手额外设置一个脏旗
目前,为了使setter也能设置a,我必须这样做: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; } } } 写起来并不痛苦,但是如果我在我的项目中使
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>