虚心求教:关于C#默认构造函数

dnomyar000 2019-08-09 06:41:22
最近开始学习C#,请教大伙儿一个问题:

开发环境:Visual Studio 2013,构建的.NET Framework 4.5项目

class Foo
{
public Foo()
{

}

public Foo(string name = "NoName")
{
Name = name;
}

public string Name { get; set; }
}

class Program
{
static void Main(string[] args)
{
Foo foo = new Foo();
Console.WriteLine("# Name: {0}", foo.Name);
Console.ReadLine();
}
}

输出:
# Name:

看输出结果感觉调用的是Foo()构造函数。
请问为什么允许这样有二义性的调用存在?C#的默认构造函数和带默认实参的构造函数之间有什么不可说的秘密吗?
...全文
272 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
小旺仔啊 2020-02-25
  • 打赏
  • 举报
回复
引用 1 楼 冰川711 的回复:
有什么不可说的秘密,你脑洞有够大的,这种情况在开发中根本不存在的好嘛,研究研究有用的东西不行么?为什么要研究脱裤子放屁的事情,真是服了
看见你骂他我就放心了(滑稽)
dnomyar000 2019-08-11
  • 打赏
  • 举报
回复
引用 10 楼 github_36000833 的回复:
[quote=引用 楼主 it_yyf 的回复:] ... 请问为什么允许这样有二义性的调用存在?C#的默认构造函数和带默认实参的构造函数之间有什么不可说的秘密吗?
你对二义性的怀疑是有道理的。 不过微软提供了明确的”解决方法重载的次序“。有了明确的次序,二义性的问题就解决了。 构造函数的重载也是函数的重载。也适用方法重载的次序。
命名实参和可选实参(C# 编程指南)
重载决策 使用命名实参和可选实参将在以下方面对重载决策产生影响: ... 如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。 这是重载决策中的常规引用的结果,该引用用于参数较少的候选项。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments 你的例子中, public Foo(){},没有可选形参,它成了首选项。 作为程序员,也可以这样组织代码,避免同事的疑惑。

class Foo
{
    public Foo() : this("NoName")
    {
    }

    public Foo(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}
[/quote] 谢谢你的解答,总算有个人看懂我提的问题了,非常感谢!
wid999 2019-08-11
  • 打赏
  • 举报
回复
我对于重载的理解,
定义:参数和返回值不相同的一组同名函数
意义:灵活使用相同名称调用作用相近的函数
wid999 2019-08-11
  • 打赏
  • 举报
回复
    class Program
{
static void Main(string[] args)
{
Console.WriteLine(AddIt());
Console.WriteLine(AddIt(1, 2));
Console.WriteLine(AddIt("Hello", "world!"));
Console.ReadKey();
}

static string AddIt() { return "Null"; }
static int AddIt(int a, int b) { return a + b; }
static string AddIt(string a, string b) { return a + " " + b; }
static System.Drawing.Image AddIt(System.Drawing.Image a, System.Drawing.Image b)
{
//这里可以写代码以实现图形叠加或者扩搌
return a;
}

/* 运行结果:
* Null
* 3
* Hello world!
*/
}


引用 4 楼 it_yyf 的回复:
[quote=引用 3 楼 wid999 的回复:]
重载,省略了override。
另外,对前辈适当谦虚点没坏处的。

谢谢,能说具体点吗?
[/quote]
github_36000833 2019-08-10
  • 打赏
  • 举报
回复
引用 楼主 it_yyf 的回复:
... 请问为什么允许这样有二义性的调用存在?C#的默认构造函数和带默认实参的构造函数之间有什么不可说的秘密吗?
你对二义性的怀疑是有道理的。 不过微软提供了明确的”解决方法重载的次序“。有了明确的次序,二义性的问题就解决了。 构造函数的重载也是函数的重载。也适用方法重载的次序。
命名实参和可选实参(C# 编程指南)
重载决策 使用命名实参和可选实参将在以下方面对重载决策产生影响: ... 如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。 这是重载决策中的常规引用的结果,该引用用于参数较少的候选项。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments 你的例子中, public Foo(){},没有可选形参,它成了首选项。 作为程序员,也可以这样组织代码,避免同事的疑惑。

class Foo
{
    public Foo() : this("NoName")
    {
    }

    public Foo(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}
大鱼> 2019-08-10
  • 打赏
  • 举报
回复
具体的可以参考方法的重载
大鱼> 2019-08-10
  • 打赏
  • 举报
回复
还是构造方法,很多时候在实例化一个类的时候我们会顺便传入一些参数使用。另外就是无论如何是构造方法还是其他方法都可以这样写,这叫方法的重载
lqwvje 2019-08-09
  • 打赏
  • 举报
回复
看输出结果感觉调用的是Foo()构造函数?? Foo foo = new Foo(); 这个本来就是调用了Foo() 如果Foo foo = new Foo("www.luofenming.com");是这样 则是调用了第二个带默认参数的构造函数
lqwvje 2019-08-09
  • 打赏
  • 举报
回复
看输出结果感觉调用的是Foo()构造函数?? Foo foo = new Foo(); 这个本来就是调用了Foo() 如果Foo foo = new Foo("www.luofenming.com");是样 则是搞用了第二个带默认参数的构造函数
qq_42254981 2019-08-09
  • 打赏
  • 举报
回复
请教别人请注意态度
dnomyar000 2019-08-09
  • 打赏
  • 举报
回复
引用 3 楼 wid999 的回复:
重载,省略了override。 另外,对前辈适当谦虚点没坏处的。
谢谢,能说具体点吗? 另外,有些人不一定是前辈,而有些前辈也不值得尊敬
wid999 2019-08-09
  • 打赏
  • 举报
回复
重载,省略了override。
另外,对前辈适当谦虚点没坏处的。
dnomyar000 2019-08-09
  • 打赏
  • 举报
回复
引用 1 楼 冰川711 的回复:
有什么不可说的秘密,你脑洞有够大的,这种情况在开发中根本不存在的好嘛,研究研究有用的东西不行么?为什么要研究脱裤子放屁的事情,真是服了
你这么激动干嘛?能解释清楚就请讲,不能解释清楚就请滚,别在这装逼,谢谢
冰川711 2019-08-09
  • 打赏
  • 举报
回复
有什么不可说的秘密,你脑洞有够大的,这种情况在开发中根本不存在的好嘛,研究研究有用的东西不行么?为什么要研究脱裤子放屁的事情,真是服了

110,536

社区成员

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

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

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