Некоторые операции в C # кажутся излишне громоздкими по сравнению с другими языками. Например, лямбды:
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);
Для меня это немного более читабельно, чем любой из вышеперечисленных. Это применимо только к однопараметрическим лямбдам, и, конечно, это значение выводится из контекста.
Редактировать: для лямбд, где сам параметр используется непосредственно '.' может быть использован в качестве прямого заполнителя:
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; при использовании точечной нотации это больше не требуется)
Он содержит множество вызовов enum, которые в эквивалентной реализации 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 #. Как вы думаете, это было бы хорошей идеей?