В некоторых ситуациях полезно иметь оба модификатора.Я просто хочу привести несколько примеров.
out
Словарь - хороший пример использования параметра out.Если вы хотите узнать, содержит ли словарь ключ, и хотите получить значение, если ключ существует, вы делаете это следующим образом:
MyType result;
if (myDictionary.TryGetValue(myKey, out result))
{
// Use result
}
Если вы не можете использовать параметр out, вам придетсязапишите это так:
Dictionary<KeyType, MyType> myDictionary = ...;
if (myDictionary.ContainsKey(myKey))
{
MyType result = myDicionary[myKey];
}
Это приведет к снижению производительности, поскольку словарь должен искать ключ два раза.Другая возможность могла бы быть такой:
Dictionary<KeyType, MyType> myDictionary = ...;
Dictionary<KeyType, MyType>.TryGetResult result = myDictionary.TryGetValue(myKey);
if (result.Succeeds)
{
MyType resultValue = result.Value;
}
, которая полезна, но, на мой взгляд, не так хороша, как выходное решение, потому что вам нужно создать дополнительную структуру или класс для результата и, конечно,код также не так чист.
ref
Ссылка полезна, когда необходимо изменить существующий объект вне вызываемого метода.
MyObject myvar = myStream.ReadMyObject();
if (dataProcessor.Process(ref myvar)) {.... }
// Data processor....
public Boolean Process(ref MyObject myvar)
{
if (!myvar.IsClean)
{
myvar = new MyObject(); // Create clean object
return false;
}
return true;
}