董昊(昊子)的专栏
一个系统构架师、系统分析师(努力学习中...)
登录
注册
全站
当前博客
空间
博客
好友
相册
留言
董昊
ID:edisundong
共
270015
次访问,排名
215
好友
10
人,关注者
49
人
做最好的自己
edisundong的文章
原创 127 篇
翻译 0 篇
转载 16 篇
评论 259 篇
董昊的公告
程序人生:
21岁通过<高级程序员>考试。
23岁大学毕业,在一家著名手机企业。
24岁通过<系统分析师>考试。
开发语言:
.net从asp+用到.net 3.5
java业余爱好者
研究方向:
目前的研究方向是企业级web开发编译器
我的联系方式:
edisundong_163.com
(_替换成@)
最近评论
shuangziye:
我汗啊!
feb9903:
你们这些无聊又浮躁的家伙,楼主不过是帖点有用的东西出来和大家分享。至于原创与否,值得在这里大呼小叫么?
edisundong:
@r_mosaic
谢谢回复,我学习了
r_mosaic:
写得真不错,我收藏了!
r_mosaic:
提一些意见:一、在描述线程与进程区别时,先描述线程,即操作系统对线程进行多任务调度;再描述进程,即线程之间是共享地址空间的,进程之间是不共享地址空间的。一个进程启动之后会自动启动一个主线程。这样就把区别描述清楚了。我可能讲得不完全对,请指正。
二、虚拟内存的定义应该直接用 i386 体系结构下的虚地址空间来定义,这样比较明确:即使是禁用了交换文件,虚拟内存机制同样起作用。比如可执行……
文章分类
.NET 新特性
(RSS)
.NET盲点
(RSS)
altas(ajax)控件
(RSS)
ERP
(RSS)
ExtJs
(RSS)
GetInfo.net
(RSS)
GPhone
(RSS)
IT与经济
(RSS)
java方法学在.net中的应用
(RSS)
SilverLight
(RSS)
WCF
(RSS)
Web技术
(RSS)
Window技术
(RSS)
WWF
(RSS)
软件构架
(RSS)
软件项目管理
(RSS)
设计模式
(RSS)
质量管理
(RSS)
收藏
相册
java
董
俱乐部
宁波.net俱乐部
宁波.NET俱乐部
存档
2008年07月(6)
2008年06月(5)
2008年05月(4)
2008年04月(2)
2008年03月(11)
2008年02月(5)
2008年01月(10)
2007年12月(1)
2007年11月(5)
2007年10月(8)
2007年09月(23)
2007年08月(23)
2007年07月(9)
2007年06月(12)
2007年05月(12)
2007年04月(7)
软件项目交易
订阅我的博客
.net程序员的盲点(一):参数修饰符ref,out ,params的区别
收藏
新一篇: .net程序员的盲点(二):两个“属性”引起的歧异-property和attribute的区别
|
旧一篇: 大智慧公式编写教程
C#
中有三个关键字
-ref,out ,params
,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性。但是既然
m$
把融入在
c#
体系中,那么我们就来认识一下
参数修饰符
ref,out ,params
吧,还有它们的区别。
NO.1 params
一个可以让方法(函数)的拥有可变参数的关键字。
原则:在方法声明中的
params
关键字之后不允许任何其他参数,并且在方法声明中只允许一个
params
关键字。
示例(拷贝到
vs2005
中即可用,下面不再说明)
public
partial
class
Form1 : Form
...
{
public
static
void
UseParams(
params
int
[] list)
...
{
string
temp
=
""
;
for
(
int
i
=
0
; i
<
list.Length; i
++
)
temp
=
temp
+
"
"
+
list[i].ToString();
MessageBox.Show(temp);
}
public
static
void
UseParams2(
params
object
[] list)
...
{
string
temp
=
""
;
for
(
int
i
=
0
; i
<
list.Length; i
++
)
temp
=
temp
+
"
"
+
list[i].ToString();
MessageBox.Show(temp);
}
public
Form1()
...
{
InitializeComponent();
}
private
void
button1_Click(
object
sender, EventArgs e)
...
{
UseParams(
1
,
2
,
3
);
//
看参数是3个
UseParams(
1
,
2
);
//
看参数是2个,可变吧
UseParams2(
1
,
'
a
'
,
"
test
"
);
int
[] myarray
=
new
int
[
3
]
...
{
10
,
11
,
12
}
;
UseParams(myarray);
//
看也可以是容器类,可变吧:)
}
}
NO.2 out
这是一个引用传递
L
。
原则一:当一个方法(函数)在使用
out
作为参数时,在方法中(函数)对
out
参数所做的任何更改都将反映在该变量中。
原则二:当希望方法返回多个值时,声明
out
方法非常有用。使用
out
参数的方法仍然可以返回一个值。一个方法可以有一个以上的
out
参数。
原则三:若要使用
out
参数,必须将参数作为
out
参数显式传递到方法。
out
参数的值不会传递到
out
参数。
原则四:不必初始化作为
out
参数传递的变量,因为
out
参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前为
out
参数赋值(只有地址没有值的参数是不能被
.net
接受的)。
原则五:属性不是变量,不能作为
out
参数传递。
原则六:如果两个方法的声明仅在
out
的使用方面不同,则会发生重载。不过,无法定义仅在
ref
和
out
方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
而以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用
ref
和
out
传递数组。
示例附后
NO.2 ref
ref
仅仅是一个地址!!!
原则一:当一个方法(函数)在使用
ref
作为参数时,在方法中(函数)对
ref
参数所做的任何更改都将反映在该变量中。
原则二:调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
原则三:若要使用
ref
参数,必须将参数作为
ref
参数显式传递到方法。
ref
参数的值可以被传递到
ref
参数。
原则四:
ref
参数传递的变量必须初始化,因为
ref
参数在进入方法(函数)时后还是它自己,它这个地址指向的还是原来的值,也因为这个原因
ref
参数也可以在使用它的方法内部不操作。
原则六:如果两种方法的声明仅在它们对
ref
的使用方面不同,则将出现重载。但是,无法定义仅在
ref
和
out
方面不同的重载。例如,以下重载声明是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
但以下重载声明是无效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有关传递数组的信息,请参见使用
ref
和
out
传递数组。
示例
public
static
string
TestOut(
out
string
i)
...
{
i
=
"
out b
"
;
return
"
return value
"
;
}
public
static
void
TestRef(
ref
string
i)
...
{
//
改变参数
i
=
"
ref b
"
;
}
public
static
void
TestNoRef(
string
refi)
...
{
//
不用改变任何东西,这个太明显了
refi
=
"
on c
"
;
}
public
Form1()
...
{
InitializeComponent();
}
private
void
button1_Click(
object
sender, EventArgs e)
...
{
string
outi;
//
不需要初始化
MessageBox.Show(TestOut(
out
outi));
//
返回值
//输出
"
return value
"
;
MessageBox.Show(outi);
//
调用后的out参数
//输出
"
out b
"
;
string
refi
=
"
a
"
;
//
必须初始化
TestRef(
ref
refi);
//
调用参数
MessageBox.Show(refi);
//输出
"
ref b
"
;
TestNoRef(refi);
//
不使用ref
MessageBox.Show(refi);
//输出
"
ref b
"
;
}
发表于 @
2007年08月03日 16:26:00
|
评论(
loading...
)
|
编辑
新一篇: .net程序员的盲点(二):两个“属性”引起的歧异-property和attribute的区别
|
旧一篇: 大智慧公式编写教程
评论
#
lileammm 发表于2007-08-06 09:51:12 IP: 58.216.235.*
string outi;//不需要初始化
MessageBox.Show(TestOut(out outi));//返回值
//输出"out b";
MessageBox.Show(outi);//调用后的out参数
//输出"return value";
------------------------------------------------------------
是不是应该是这样的啊?
string outi;//不需要初始化
MessageBox.Show(TestOut(out outi));//返回值
//输出"return value";
MessageBox.Show(outi);//调用后的out参数
//输出"out b";
#
edisundong 发表于2007-08-06 12:08:21 IP: 125.115.163.*
你是对的,改回来了,感谢lileammm校正
#
zzmsl 发表于2007-08-07 10:37:55 IP: 116.11.151.*
不算盲点,很多人都懂
#
zju3020912063 发表于2007-08-12 12:05:53 IP: 221.137.110.*
看了这篇文章才知道.net也有可变参数表,长见识,不过这是不是2.0的新功能啊,以前看2.0的新增功能介绍里只有泛型被吹得一塌糊涂.
楼主能再写篇文章详细介绍下.net泛型吗,特别是值类型做参数的泛型,我搞得一塌糊涂,完全不知道如何用.
#
edisundong 发表于2007-08-13 08:44:58 IP: 125.115.3.*
ref,out ,params,并不是.net 2.0才有,以前的版本都可以使用,至于泛型,最近也想写这个话题,也是“c#参考java”的又一个证据:)
#
chy3503319 发表于2008-07-09 17:42:37 IP: 210.83.223.*
挺好
发表评论
姓 名:
主 页:
校验码:
看不清,换一张
当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击
登录