Код, как будто следующий программист, занимающий проект, является серийным убийцей. Другими словами, используйте вторую опцию, которую Вы упомянули.
In C#, you have anonymous types; these are similar but have their own limitations:
var result = new { Speed = 12.4, Distance = 8, Caption = "car 1" };
However, it is hard to consume these as a caller, unless you use "cast by example" (brittle), reflection, or dynamic
. Of the three, the last is the most appetising.
dynamic result = GetSomething();
Console.WriteLine(result.Speed);
Console.WriteLine(result.Distance);
In most cases, it would be a better idea just to use a regular class - but this approach does have some practical uses; for example, look at how they are used in ASP.NET MVC to pass around configuration information simply and conveniently (which would otherwise require a dictionary). A bit like how jQuery allows you to pass options as properties on an object.
Я не уверен, что это именно то, что вы ищете, но в Haskell вы можете иметь запись с указанными именами и типами:
data Movement = Movement { speed :: Double, distance :: Int } deriving (Show)
main = do
print $ Movement 3.14 100
print Movement {distance = 5, speed = 2.1}
print Movement {speed = 9, distance = -4}
output:
Movement {speed = 3.14, distance = 100} Movement {speed = 2.1, distance = 5} Movement {speed = 9.0, distance = -4}
Но технически это не кортеж . В Haskell есть кортежи, но, насколько мне известно, они не могут именоваться
. Это действительно не так уж и далеко от простой структуры в любом языке, производном от C. Может я что-то упустил в вопросе.
Вы имеете в виду, что-то вроде Python collections. namedtuple ? Ну, Python (текущие версии 2.6 и 3.1) их поддерживает ;-). А если серьезно, я не знаю ни одного языка со статической типизацией, в котором бы они были встроены.
Что плохого в использовании структур или классов в C #?
public class SpeedDistance{
public double Speed;
public int Distance;
}
Я не уверен, для чего вам это нужно - кортеж - это просто структура, содержащая разные типы данных. Если вам действительно нужны именованные свойства, вам придется создать собственный тип или создать анонимный тип на лету.
Я не знаю ни одного статически типизированного языка, который бы поддерживал бы это, но C # определенно не поддерживает.