假设我正在上课
Class ABC
{
public string Method1()
{
return "a";
}
public string Method2()
{
return "b";
}
public string Method3()
{
return "c";
}
}
现在我用两种方式调用这些方法,如:
ABC obj=new ABC();
Response.Write(obj.Method1());
Response.Write(obj.Method2());
另一种方式
Response.Write(new ABC().Method1());
Response.Write(new ABC().Method2());
上述两种方法的输出相同。
有些人可以帮助我理解obj.Method1()
和new ABC().Method1()
之间的区别
在此先感谢..
答案 0 :(得分:3)
obj
和new ABC()
是不同的实例。在您的示例中,输出是相同的,因为没有要显示的实例级数据。
尝试这样做可以看出差异:
Class ABC
{
public string Name = "default";
public string Method1()
{
return "a";
}
}
然后使用下面的代码显示与实例级数据的区别:
ABC obj=new ABC();
obj.Name = "NewObject";
Response.Write(obj.Method1());
Response.Write(obj.Name);
Response.Write(new ABC().Method1());
Response.Write(new ABC().Name);
答案 1 :(得分:1)
@ d-stanley试图说的是你在创造上分配内存是非常宝贵的资源。
更完整的答案是:在创建时考虑了一些逻辑的类。虽然是完全可行的Response.Write(new ABC().Method1());
,但这是非常短的功能而没有那么多无用......当你设计class
时,你实现了一些逻辑边界功能和属性。例如,FileStream
的内部属性为Stream
,并且可以通过各种属性进行访问,您可以在重载的Open()
方法中设置它并在Dispose()
方法中将其销毁。例如,另一个类BinaryReader
也会实现Stream
,但会以不同的方式对其进行威胁。根据您的逻辑,您可以在单个类上实现所有函数 - 一些MotherOfAllFunctions
类实现FileStream
和BinaryReader
的所有功能 - 但这不是一种方法。
另一点:在大多数情况下,会使用一些(或巨大的)内存来初始化类的某些内部逻辑 - 例如SqlConnection
类。然后你调用Open()
或任何其他方法来调用数据库 - 有一些非常强大的机制被抛出来支持状态机初始化,托管到非管理调用并且可以执行大量代码。
实际上你在new SomeCLass().SomeMethod<int>(ref AnotherObject)
中做的是:
Response.Write(
var tmpABC = new ABC(); // Constructor call . Executed always (may throw)
string result = tmpABC.Method1(); // Or whatever could be casted to `string`
tmpABC.Dispose(); // GC will kick-in and try to free memory
return result;
);
如您所见 - 这与您以这种方式编写的代码相同。所以这里发生的是大量的内存分配,几乎所有这些宝贵的内存都被丢弃了。初始化ABC()
类及其所有功能一次然后在任何地方使用它更有意义,因此最小化内存 over 分配。例如 - 在DAL类中的每个函数调用中打开SqlConnection
函数没有任何意义,然后立即关闭它 - 更好地声明局部变量并使其保持活动状态 - 只要应用程序,一些完全初始化的类就会生效线程进程存在。所以在这种代码风格的情况下:
public class Program
{
private static FileStream streamToLogFile = new FileStream(...);
public int Main(string [] args)
{
new Run(new Form1(streamToLogFile));
}
}
在这个逻辑中 - 没有必要保持类Form1
并且我在内联创建了它,但是访问FileStream
对象(有价值的资源!)所需的所有函数都将访问仅初始化一次的同一实例。