最近在看C#高级编程 第六版,看到80页了。有一个地方不能理解public class MyNumber
{
private int number;
private MyNumber(int number)
{
this.number=number;
}
}
书上说由于使用了private关键字,所以不能在外部用new来实例化。还说这样做的目的有两种:1、类仅用作某些静态成员或属性的容器,因此永远不会实例化。2、希望类仅通过某个静态成员函数来实例化,也就是所谓的对象实例化的类代理方法。请问上面两点该如何理解?谢谢
{
private int number;
private MyNumber(int number)
{
this.number=number;
}
}
书上说由于使用了private关键字,所以不能在外部用new来实例化。还说这样做的目的有两种:1、类仅用作某些静态成员或属性的容器,因此永远不会实例化。2、希望类仅通过某个静态成员函数来实例化,也就是所谓的对象实例化的类代理方法。请问上面两点该如何理解?谢谢
{
static MyNumber _instance = null;
readonly static object _locker = new ();
private int number;
private MyNumber(int number)
{
this.number=number;
} public static MyNumber GetInstance(int number)
{
lock(_locker)
{
if(_instance == null)
{
_instance = new MyNumber(number);
}
}
return _instance;
}
} 使用时
MyNumber myNumber = MyNumber.GetInstance(5);
这只是例子,但对于这种数字为参数的,这么做是不理想的。
public class SystemSession
{
private static SystemSession instance;
private static object syncLock = new object();
protected SystemSession()
{
}
public static SystemSession GetInstance()
{
if (instance == null)
{
lock (syncLock)
{
instance = new SystemSession();
}
}
return instance;
}
}
这样能保证SystemSession.GetInstance()这个实例在程序中只有一个,这种单例在某些情况下很有用
一般情况下:利用new关键字调用构造函数MyNumber(int number)such as:MyNumber myNumber = new MyNumber(1);_在构造函数是共有的前提下,都会在内存中创建一个MyNumber类型的实例。而构造函数在默认情况下都是public的,除非自己编写构造函数再将其定义为私有——这样客户代码将无法使用new关键字实例出对象,而只有类本身才能有访问构造函数的权限(new关键字)。1、类仅用作某些静态成员或属性的容器,因此永远不会实例化。解释:类的静态成员不需要实例化。所以类的设计者不想让客户程序可以实例出该类的对象。
2、希望类仅通过某个静态成员函数来实例化,也就是所谓的对象实例化的类代理方法。 解释:上述两位施主就给了很好的demo。类的设计者希望通过其他方式实例出类的对象,而不使用new 关键字
public class MyNumber
{
private int number;
private MyNumber(int number)
{
this.number=number;
}
} 不能MyNumber myNum1=new MyNumber(10);
但是可以MyNumber myNum1=new MyNumber();
顺便指出楼上的一个bug不能MyNumber myNum1=new MyNumber(10);
但是可以MyNumber myNum1=new MyNumber();这句话不对,因为C#中一旦自定义了带参数的构造函数,系统就不会提供无参数的默认构造函数。