Csharp/C Sharp/Language Basics/Ref Out
Содержание
- 1 compare the difference between passing a null reference vs. a reference to a zero length string
- 2 Reference, output and value parameters.
- 3 Testing the effects of passing array references by value and by reference.
- 4 the out descriptor allows a function a value in an argument without initializing the argument
compare the difference between passing a null reference vs. a reference to a zero length string
<source lang="csharp"> using System; public class Class1 {
public static void Main(string[] strings) { Example exampleObject = new Example(); Console.WriteLine("Pass a null object:"); string s = null; exampleObject.TestString(s); Console.WriteLine(); Console.WriteLine("Pass an empty string:"); exampleObject.TestString(""); Console.WriteLine(); Console.WriteLine("Pass a real string:"); exampleObject.TestString("test string"); Console.WriteLine(); }
} class Example {
public void TestString(string sTest) { if (sTest == null) { Console.WriteLine("sTest is null"); return; } if (String.rupare(sTest, "") == 0) { Console.WriteLine("sTest references an empty string"); return; } Console.WriteLine("sTest refers to: "" + sTest + """); }
}
</source>
Reference, output and value parameters.
<source lang="csharp">
using System;
class ReferenceAndOutputParameters
{
public void aMethod() { int y = 5; int z; Console.WriteLine( "Original value of y: {0}", y ); Console.WriteLine( "Original value of z: uninitialized\n" ); SquareRef( ref y ); SquareOut( out z ); Console.WriteLine( "Value of y after SquareRef: {0}", y ); Console.WriteLine( "Value of z after SquareOut: {0}\n", z ); Square( y ); Square( z ); Console.WriteLine( "Value of y after Square: {0}", y ); Console.WriteLine( "Value of z after Square: {0}", z ); } void SquareRef( ref int x ) { x = x * x; } void SquareOut( out int x ) { x = 6; x = x * x; } void Square( int x ) { x = x * x; }
} class ReferenceAndOutputParamtersTest {
static void Main( string[] args ) { ReferenceAndOutputParameters test = new ReferenceAndOutputParameters(); test.aMethod(); }
}
</source>
Testing the effects of passing array references by value and by reference.
<source lang="csharp">
using System; public class ArrayReferenceTest {
public static void Main( string[] args ) { int[] firstArray = { 1, 2, 3 }; int[] firstArrayCopy = firstArray; for ( int i = 0; i < firstArray.Length; i++ ) Console.Write( "{0} ", firstArray[ i ] ); FirstDouble( firstArray ); for ( int i = 0; i < firstArray.Length; i++ ) Console.Write( "{0} ", firstArray[ i ] ); if ( firstArray == firstArrayCopy ) Console.WriteLine("same" ); else Console.WriteLine("different" ); int[] secondArray = { 1, 2, 3 }; int[] secondArrayCopy = secondArray; for ( int i = 0; i < secondArray.Length; i++ ) Console.Write( "{0} ", secondArray[ i ] ); SecondDouble( ref secondArray ); for ( int i = 0; i < secondArray.Length; i++ ) Console.Write( "{0} ", secondArray[ i ] ); if ( secondArray == secondArrayCopy ) Console.WriteLine("same" ); else Console.WriteLine("different" ); } public static void FirstDouble( int[] array ) { for ( int i = 0; i < array.Length; i++ ) array[ i ] *= 2; array = new int[] { 11, 12, 13 }; } public static void SecondDouble( ref int[] array ) { for ( int i = 0; i < array.Length; i++ ) array[ i ] *= 2; array = new int[] { 11, 12, 13 }; }
}
</source>
the out descriptor allows a function a value in an argument without initializing the argument
<source lang="csharp"> using System; public class Test {
public static void Main(string[] strings) { Student student; Example example = new Example(); example.ReturnStudent(out student); Console.WriteLine("Student is " + student.name); }
} class Example {
public void ReturnStudent(out Student student) { student = new Student(); student.name = "Jenny"; }
} public class Student {
public string name;
}
</source>