C#的一些操作
我们C#
实在是太厉害了!(甲亢)
演进了这么多年, 现在的语法已经和十年前大不一样了
下面就介绍一些骚平时比较少见到的操作
对非集合对象使用foreach
在日常搬砖中, foreach
是最常使用的遍历数据的方法
但是通常情况下我们只会对集合类型或者实现了 IEnumerable
接口的类型使用
其实, 即使是不实现 IEnumerable
的对象, 也可以使用 foreach
foreach (var item in new TestClass())
Console.WriteLine(item);
public class TestClass
{
public IEnumerator<string> GetEnumerator()
{
yield return "1";
yield return "2";
yield return "3";
yield return "4";
yield return "5";
}
}
实际上只需要实现 GetEnumerator()
即可
也可以使用扩展方法为 TestClass
提供 GetEnumerator()
方法
foreach (var item in new TestClass())
Console.WriteLine(item);
public class TestClass
{
}
public static class TestClassExt
{
public static IEnumerator<string> GetEnumerator(this TestClass obj)
{
yield return "1";
yield return "2";
yield return "3";
yield return "4";
yield return "5";
}
}
这样可以在不修改 TestClass
内部实现的情况下为其实现 foreach
功能
无限延申的 空合并运算符(??)
如果 A 不为空, 就赋值给 C, 否则将 B 赋值给 C
这是一个很常见的场景, 以前的一般做法是使用 if else 或者三元
if (a != null)
c = a;
else
c = b;
c = a != null ? a : b;
针对这种场景, 现在可以使用 空合并运算符(??)
实现
c = a ?? b;
如果 "候选项" 很多, ??
还可以继续延申
c = a ?? b ?? d ?? e ?? f ?? g;
不过有一点需要注意, ??
的运算优先级比较低, 如下
var value = "1" + a.Value ?? b.Value;
假设 a.Value=null
, b.Value="10"
最终 value
的值会 是"1", 而不是"110"
通过元组简化赋值操作
当我们使用依赖注入的时候, 经常需要将构造函数中注入的对象赋值到私有变量中
class SomeService
{
private readonly Type0 _type0;
private readonly Type1 _type1;
private readonly Type2 _type2;
private readonly Type3 _type3;
// 更多
public SomeService(Type0 type0, Type1 type1, Type2 type2, Type3 type3)
{
_type0 = type0;
_type1 = type1;
_type2 = type2;
_type3 = type3;
// 更多
}
}
我是不怎么喜欢写这么多赋值操作的, 所以找了一些可以简化操作的方法
- 找一个可以提供快捷操作的编辑器或者插件
- 熟练地使用多光标快速完成多行代码的编写
- 使用元组批量赋值
以上的1,2两点都需要编辑器支持, 所以下面就只演示3
class SomeService
{
private readonly Type0 _type0;
private readonly Type1 _type1;
private readonly Type2 _type2;
private readonly Type3 _type3;
// 更多
public SomeService(Type0 type0, Type1 type1, Type2 type2, Type3 type3)
{
(_type0, _type1, _type2, _type3) = (type0, type1, type2, type3);
// 更多
}
}