学习C#引用参数的体会 - An attitude will be everything(No risk,No gain) - 博客园
2008-04-28 12:20
387 查看
下面我总结下我对out和ref引用参数的看法:
1.out和ref引用参数的相同点:都是通过引用传递参数给函数;
2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始化,并且不能在调用它的函数中初始化,以下例子是错误的:
namespace refConsoleApp
{
class MyRefClass
{
static void MyRefMethod(ref int i)
{
int i=20;
}
static void main(string[] args)
{
int value; //not initialized the value;
MyRefMethod(ref value);
Console.WriteLine("The value is {0}",value);
}
}
}
3.使用out引用多个参数来返回多个值,这允许方法任意地返回需要的值,以下例子:
namespace multi_outConsoleApp
{
class MyMultipleoutClass
{
static void MyMultipleMethod(out int i, out string str1, out string str2)
{
i = 20;
str1 = "I was born";
str2 = "zhaoqing";
}
static void Main(string[] args)
{
int value;
string s1, s2;
MyMultipleMethod(out value,out s1,out s2);
Console.WriteLine("The integer value is {0}/nThe first string value is {1}/nThe second string value is {2}", value, s1, s2);
}
}
}
显示的结果为:
The integer value is 20
The first string value is I was born
The second string value is zhaoqing
4. 如果一个方法使用ref引用参数,另一个方法使用out引用参数,则这两个相同方法名的函数不能重载,否则出现编译错误,以下例子出现: " cannot define overloaded methods that differ only on ref and out "
namespace overloadofConsoleApp
{
class overloadofclass
{
static void MyMethod(ref int i)
{
i = 20;
}
static void MyMethod(out int i)
{
i = 40;
}
static void Main(string[] args)
{
int refvalue=0;
MyMethod(ref refvalue);
Console.WriteLine("The value is {0}", refvalue);
int outvalue;
MyMethod(out outvalue);
Console.WriteLine("The value is {0}", outvalue);
}
}
}
以下例子是正确的:
namespace overloadofConsoleApp
{
class overloadofclass
{
static void MyMethod(ref int i)
{
i = 20;
}
static void MyMethod( int i)
{
i = 40;
}
static void Main(string[] args)
{
int refvalue=0;
MyMethod(ref refvalue);
Console.WriteLine("The value is {0}", refvalue);
int outvalue=0;
MyMethod(outvalue);
Console.WriteLine("The value is {0}", outvalue);
}
}
}
显示结果为:
The value is 20
The value is 0
5.通过ref参数来改变引用类型,因为引用类型作为ref参数来传递,同时该对象会被改变.以下例子:
namespace refConsoleApp
{
class refclass
{
static void RefMethod(ref string s)
{
s = "I was born in zhaoqing";
}
static void Main(string[] args)
{
string str = "I am goalbell";
RefMethod(ref str);
Console.WriteLine("The value is {0}", str);
}
}
}
显示结果:
The value is I was born in zhaoqing
6.通过ref和out来传递数组,用ref传递数组的时候,必须在main函数里面初始化一个数组,而在被调用的方法中可以指定一个数组为空值或者初始化成一个不同的数组;用out 传递数组的时候,在被调用的方法中确定为一个数组赋值.以下例子来区别一下它们:
namespace refszConsoleApp
{
class refszclass
{
static void RefszMethod(ref int[] arr)
{
if (arr == null) //assigned the null value
{
arr = new int[5]; //initialized to a different array
}
}
static void Main(string[] args)
{
int[] theArray ={ 1, 2, 3, 4, 5 };//initialize the theArray
RefszMethod(ref theArray); // pass the value using of ref
Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
Console.WriteLine(theArray[i] + "");
}
}
}
}
namespace outszConsoleApp
{
class outszclass
{
static void OutszMethod(out int[] arr)
{
arr = new int[5] { 1, 2, 3, 4, 5 };//initialize the arr
}
static void Main(string[] args)
{
int[] theArray ;
OutszMethod(out theArray);
Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
Console.WriteLine(theArray[i] + "");
}
}
}
}
1.out和ref引用参数的相同点:都是通过引用传递参数给函数;
2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始化,并且不能在调用它的函数中初始化,以下例子是错误的:
namespace refConsoleApp
{
class MyRefClass
{
static void MyRefMethod(ref int i)
{
int i=20;
}
static void main(string[] args)
{
int value; //not initialized the value;
MyRefMethod(ref value);
Console.WriteLine("The value is {0}",value);
}
}
}
3.使用out引用多个参数来返回多个值,这允许方法任意地返回需要的值,以下例子:
namespace multi_outConsoleApp
{
class MyMultipleoutClass
{
static void MyMultipleMethod(out int i, out string str1, out string str2)
{
i = 20;
str1 = "I was born";
str2 = "zhaoqing";
}
static void Main(string[] args)
{
int value;
string s1, s2;
MyMultipleMethod(out value,out s1,out s2);
Console.WriteLine("The integer value is {0}/nThe first string value is {1}/nThe second string value is {2}", value, s1, s2);
}
}
}
显示的结果为:
The integer value is 20
The first string value is I was born
The second string value is zhaoqing
4. 如果一个方法使用ref引用参数,另一个方法使用out引用参数,则这两个相同方法名的函数不能重载,否则出现编译错误,以下例子出现: " cannot define overloaded methods that differ only on ref and out "
namespace overloadofConsoleApp
{
class overloadofclass
{
static void MyMethod(ref int i)
{
i = 20;
}
static void MyMethod(out int i)
{
i = 40;
}
static void Main(string[] args)
{
int refvalue=0;
MyMethod(ref refvalue);
Console.WriteLine("The value is {0}", refvalue);
int outvalue;
MyMethod(out outvalue);
Console.WriteLine("The value is {0}", outvalue);
}
}
}
以下例子是正确的:
namespace overloadofConsoleApp
{
class overloadofclass
{
static void MyMethod(ref int i)
{
i = 20;
}
static void MyMethod( int i)
{
i = 40;
}
static void Main(string[] args)
{
int refvalue=0;
MyMethod(ref refvalue);
Console.WriteLine("The value is {0}", refvalue);
int outvalue=0;
MyMethod(outvalue);
Console.WriteLine("The value is {0}", outvalue);
}
}
}
显示结果为:
The value is 20
The value is 0
5.通过ref参数来改变引用类型,因为引用类型作为ref参数来传递,同时该对象会被改变.以下例子:
namespace refConsoleApp
{
class refclass
{
static void RefMethod(ref string s)
{
s = "I was born in zhaoqing";
}
static void Main(string[] args)
{
string str = "I am goalbell";
RefMethod(ref str);
Console.WriteLine("The value is {0}", str);
}
}
}
显示结果:
The value is I was born in zhaoqing
6.通过ref和out来传递数组,用ref传递数组的时候,必须在main函数里面初始化一个数组,而在被调用的方法中可以指定一个数组为空值或者初始化成一个不同的数组;用out 传递数组的时候,在被调用的方法中确定为一个数组赋值.以下例子来区别一下它们:
namespace refszConsoleApp
{
class refszclass
{
static void RefszMethod(ref int[] arr)
{
if (arr == null) //assigned the null value
{
arr = new int[5]; //initialized to a different array
}
}
static void Main(string[] args)
{
int[] theArray ={ 1, 2, 3, 4, 5 };//initialize the theArray
RefszMethod(ref theArray); // pass the value using of ref
Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
Console.WriteLine(theArray[i] + "");
}
}
}
}
namespace outszConsoleApp
{
class outszclass
{
static void OutszMethod(out int[] arr)
{
arr = new int[5] { 1, 2, 3, 4, 5 };//initialize the arr
}
static void Main(string[] args)
{
int[] theArray ;
OutszMethod(out theArray);
Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
Console.WriteLine(theArray[i] + "");
}
}
}
}
相关文章推荐
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- c#学习2——值参数、引用参数、输出参数
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
- C#学习笔记之——数据类型,引用参数类型
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
- C#学习基本概念之传递引用类型参数(二)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一) 分类: C# 2012-11-01 22:12 620人阅读 评论(0) 收藏
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C#学习笔记二 引用参数和值参数
- C#基础学习--方法参数的种类,值参数,引用参数(ref),输出参数(out),数组参数(params)
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- C# 方法参数传递之值传递和引用传递
- C#.NET中的引用参数(带关键字ref)和值参数
- (学习笔记)从引用参数谈到左右值
- DLL动态库设置断点,出错:The breakpoint will not currently be hit. No symbols have been loaded for this document
- C#学习笔记 3 值类型与引用类型
- C# 函数参数传递(按值和引用)
- C#的引用参数和值参数