假设视图模型正确实现,在后面的代码中对视图模型(未指定类型)的名为foo的属性进行更改的最佳方法是什么INotifyPropertyChanged
?
通常可以绑定控件元素来查看模型属性,一切正常.但在这种情况下,这还不够,我需要在属性更改时执行一些c#行.
可以监听DataContext的相应事件,但是,我还处理了DataContext本身的更改.另一种可能的解决方案是DependencyProperty
在代码隐藏文件中引入一个.但是有没有更短的方式?
有没有办法让分析器理解变量Bar
具有以下情况的值?
#nullable enable
class Foo {
bool GenerateArray => Bar.HasValue;
int? Bar { get; set; }
void FooBar() {
var data = (GenerateArray) ? new int[Bar.Value] : null;
}
}
Run Code Online (Sandbox Code Playgroud)
有警告“可空值类型可能为空”。因为Bar.Value
但显然不可能。
我知道有两种方法可以避免警告。两者都有缺点:
Bar.HasValue
直接使用而不是属性GenerateArray
。但是使用GenerateArray
可以提高可读性。Bar!.Value
代替Bar.Value
. 但是,如果有人更改了代码,例如,通过GenerateArray
在将来创建自动属性,警告可能会再次变得相关,但不会出现。这里的问题与此问题略有不同,后者使用局部变量而不是属性。如果我理解正确的话,下面接受的答案适用于属性(只要 C# 9 发布),但不适用于局部变量。因此,这个问题不是重复的。
在面向 .NET Framework 4.7.2 的 ac# 项目中,我将本地函数设为静态,因为 Visual Studio (16.3.3) 建议这样做。一切都编译并运行良好。但是当我在安装了 Visual Studio Build Tools (16.3.3) 的 CI 构建服务器上推送它时,它抱怨:
错误 CS8652:“静态本地函数”功能当前处于预览状态且不受支持。要使用预览功能,请使用“预览”语言版本。
我能弄清楚的是,静态本地函数是 C# 8 的一项功能,而 C# 8 不适用于面向 .NET Framework 4.7.2 的项目。那么为什么它首先起作用,我该怎么做才能让它在构建服务器上编译?
有没有比以下更紧凑的方法来编写一次迭代两个列表的循环:
var listA = new List<string>();
var listB = new List<int>();
foreach (var (itemFromListA, itemFromListB) in listA.Zip(listB,
(itemFromListA, itemFromListB)=>(itemFromListA, itemFromListB)){
// do something with itemFromListA and itemFromListB
}
Run Code Online (Sandbox Code Playgroud)
键入(itemFromListA, itemFromListB)
三遍似乎不必要地繁琐,而且(itemFromListA, itemFromListB)=>(itemFromListA, itemFromListB)
对于身份运算符来说,诸如此类的内容太长了。
C# 9 引入了记录引用类型。一条记录提供了一些合成方法,如复制构造函数、克隆操作、哈希码计算和比较/相等操作。在我看来,使用记录而不是一般的类很方便。有理由不这样做吗?
在我看来,目前作为编辑器的 Visual Studio 不支持记录和类,但这在未来可能会改变。