You use the ref keyword in the following contexts:
- In a method signature and in a method call, to pass an argument to a method by reference.
sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csPassByReference
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - In a method signature, to return a value to the caller by reference. For more information, see
ref return.sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csReturnByReference
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - In a declaration of a local variable, to declare a reference variable.
sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csLocalRef
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - As the part of a conditional ref expression or a ref assignment operator.
sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csConditionalRef
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - In a
structdeclaration, to declare aref struct. For more information, see therefstructure types article.sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csSnippetRefStruct
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - In a
ref structdefinition, to declare areffield. For more information, see thereffields section of therefstructure types article.sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csSnippetRefField
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric> - In a generic type declaration to specify that a type parameter
allows ref structtypes.sample · csharpdocs/csharp/language-reference/keywords/snippets/refKeyword.csSnippetRefGeneric
public class RefKeywordExamples { // <PassByReference> public void M(ref int refParameter) { refParameter += 42; } // </PassByReference> // <ReturnByReference> public ref int RefMax(ref int left, ref int right) { if (left > right) { return ref left; } else { return ref right; } } // </ReturnByReference> // <LocalRef> public void M2(int variable) { ref int aliasOfvariable = ref variable; } // </LocalRef> // <ConditionalRef> public ref int RefMaxConditions(ref int left, ref int right) { ref int returnValue = ref left > right ? ref left : ref right; return ref returnValue; } // </ConditionalRef> } // <SnippetRefStruct> public ref struct CustomRef { public ReadOnlySpan<int> Inputs; public ReadOnlySpan<int> Outputs; } // </SnippetRefStruct> // <SnippetRefField> public ref struct RefFieldExample { private ref int number; } // </SnippetRefField> // <SnippetRefGeneric> class RefStructGeneric<T, S> where T : allows ref struct where S : T { // etc } // </SnippetRefGeneric>