c# – 隐式上下文相关运算符的概念. (点)作为语法糖

与其他语言相比,C#中的某些操作似乎不必要地笨重.例如lambdas:

students.GroupBy(student => student.State).Where(student => student.Count > 1).OrderByReversed(studentGroup => studentGroup.Count);

这可以通过使用非常短的变量名来缩短:

students.GroupBy(s => s.State).Where(s => s.Count > 1).OrderByReversed(sg => sg.Count);

但是这种变量在上下文之外很难理解.进一步缩短它的一种方法是简单地完全跳过单参数列表,并使点隐含参数:

students.GroupBy(.State).Where(.Count > 1).OrderByReversed(.Count);

对我来说,这比上述任何一个都更具可读性.它仅适用于单参数lambdas,当然它的含义是从上下文推断出来的.

编辑:对于lambdas,参数本身直接使用’.’可以用作直接占位符:

var lines = text.Split("\n").Where(line => line != "");

可以缩短一点使用:

var lines = text.Split("\n").Where(. != "");

可以使用这种下级运算符的另一个地方是Enum传递.当从上下文中显而易见时,枚举的名称通常会传递得太多.例如,使用OpenTK(OpenGL的C#实现),创建一个简单的纹理需要每次都调用这样的东西:

GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bd.Width, bd.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, myPointer);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

(请注意,OpenTK.Graphics.OpenGL.PixelFormat必须以全名传递,因为它与System.Drawing.Imaging.PixelFormat冲突;使用点符号不再需要这样)

这包含许多枚举调用,这些调用在等效的C实现中要短得多,因此乍一看更容易阅读.我们可以尝试跳过枚举名称,并从上下文中推断出它们(被调用方法的参数类型):

GL.TexImage2D(.Texture2D, 0, .Rgba, bd.Width, bd.Height, 0, .Bgr, .UnsignedByte, myPointer);
GL.TexParameter(.Texture2D, .TextureMinFilter, (int).Linear);
GL.TexParameter(.Texture2D, .TextureMagFilter, (int).Linear);

这不仅短,而且比C等同,更容易阅读,同时保留了语言的强类型性质.我确定还有其他地方可以使用,这些只是我希望在未来的C#版本中看到的一些语法示例.您怎么看?这是个好主意吗?

最佳答案 关于你的第一个例子,假设我们看到了

(x,y) => .z + .q;

z是x还是y的成员?如果x和y都有一个名为z的成员怎么办?

点赞