C#构造函数问题

sam-007 2011-09-20 12:07:18
最近在阅读一本书,在书中写到:
1、public class MyClass
{
private string name;
public MyClass()
:this("")
{

}
public MyClass(string name)
{
this.name = name;
}
}
2、public class MyClass
{
private string name;
public MyClass()
{

}
public MyClass(string name)
{
this.name = name;
}
}
请问一下哪位仁兄知道在创建对象时,使用不带参数的构造函数。以上两种方式分别创建不带参数的构造函数的实例对象时的区别在哪里?
...全文
252 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingcsharp 2011-09-20
  • 打赏
  • 举报
回复
哪位仁兄知道在创建对象时,使用不带参数的构造函数。以上两种方式分别创建不带参数的构造函数的实例对象时的区别在哪里?

区别是、
一个对name赋了值,而另一个没有
因为调用的构造函数不一样!
Lemon2050 2011-09-20
  • 打赏
  • 举报
回复
首先c#的类会有一个不带参数的默认构造函数,这是自带的,默认的,即使你不定义,也会默认存在

1中的不带参数的构造函数,其实它调用了带参数的构造函数(this("")就是和MyClass("")是同义的),也就是public MyClass(string name),也就是说,不但创建了一个实例对象,1其实还对name进行了赋值。只是name="".

2的默认构造函数就什么都不做了,只是创建一个实例对象。
funxu 2011-09-20
  • 打赏
  • 举报
回复
区别是前者执行不带参数的构造函数时会调用带参构造函数给name赋值
youzelin 2011-09-20
  • 打赏
  • 举报
回复
这跟执行效率有鸟关系啊,就多执行一次带参构造函数,能有什么性能差别啊,
楼主,你的项目需求是什么?以至于在构造函数调用次数这块就已经让你开始考虑效率了。
vrhero 2011-09-20
  • 打赏
  • 举报
回复
两个完全不同的逻辑,胡扯什么“执行效率”...
Icedmilk 2011-09-20
  • 打赏
  • 举报
回复
你问1+1等于几
我们告诉你,1+1=2
然后你又告诉我们,我早就知道1+1=2了,这不是我想要的回答

难道你想知道为什么1+1=2?

这与执行效率有屁关系,就多了一次函数调用而已,所说多了,这也不能说是性能损失,因为有的情况下这是必须的。

[Quote=引用 4 楼 lsc19890723 的回复:]
你们说的我都知道,不是我想要的回答!你们可以从执行效率考虑。反正我是不明白。当然你们说的我都知道
[/Quote]
xiongxyt2 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lsc19890723 的回复:]
你们说的我都知道,不是我想要的回答!你们可以从执行效率考虑。反正我是不明白。当然你们说的我都知道
[/Quote]
实例化时就会执行构造函数来给字段(你自理就是name)初始化

public MyClass()
:this("")
用这个 MyClass thisClass=new MyClass();这是会通过this("")
调用
public MyClass(string name)
{
this.name = name;
}
thisClass.name是有值的(就是你this里面的参数“”)


2、下面那个MyClass _Class=new MyClass();不会调用那个有参数的构造函数,所以你刚创建的对象的name是没有值的





要知道效率的话,你自己去测试吧

using System.Runtime.InteropServices;
using System.Diagnostics;
#region 优化
Stopwatch timer = new Stopwatch();
// initialize your code here
GC.Collect(2);
GC.WaitForPendingFinalizers();
GC.Collect(2);
GC.WaitForPendingFinalizers();

timer.Start();
//Do your test here

timer.Stop();

Console.WriteLine(timer.ElapsedMilliseconds.ToString());
#endregion

/*
在测试之前强制垃圾回收。WaitForPendingFinalizers()将会挂起当前线程,
直到GC完全结束。注意,这里强制进行了2次垃圾回收。
如果你对垃圾回收有所了解的话,那么应该知道当GC发现一个对象有Finalize()方法时,
会先调用Finalize(),然后到下一次GC发生时才回收这个对象,
我们确保在测试之前所有垃圾都已经回收释放了。
*/


feng84131421 2011-09-20
  • 打赏
  • 举报
回复
第一种相当于默认给name赋“”吧,同理也可以默认赋“a”等public MyClass():this("a")
调用 MyClass obj = new MyClass();的场合相当于给name赋值“”或者“a”

第二种就和name无关了
调用 MyClass obj = new MyClass();
name还是定义时候的值,这里应该是“”

我想这样写会好理解一些
public class MyClass
{
private string name;
public MyClass()
:this("要给name定义的值")
{

}
public MyClass(string name)
{
this.name = name;
}
}
  • 打赏
  • 举报
回复
第1种调用无参构造时,会调用到MyClass(""),也就是字段name=""
第2种中会调用无参构造,在对Name赋值前,它将会是null
funxu 2011-09-20
  • 打赏
  • 举报
回复
LZ有个性,求知还拿出一副我什么都懂的架势
"不是我想要的回答!" 还是叹号,话说那是因为问题本身有问题吧"以上两种方式分别创建不带参数的构造函数的实例对象时的区别在哪里?"
"你们可以从执行效率考虑" ?我欠你钱么?
"反正我是不明白。当然你们说的我都知道" LZ都知道了我们还答什么啊
sam-007 2011-09-20
  • 打赏
  • 举报
回复
你们说的我都知道,不是我想要的回答!你们可以从执行效率考虑。反正我是不明白。当然你们说的我都知道

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧