C#语言规范3.0的第10.13节"析构函数"声明如下:
析构函数不是继承的.因此,除了可以在该类中声明的类之外,类没有析构函数.
" C#编程指南"的 "Destructors"部分包含一个示例,演示如何调用继承层次结构中的析构函数,包括以下语句:
... ...类的析构函数是自动调用的,按顺序,从最大派生到最小派生.
我用各种实际例子对此进行了调查,其中包括一个定义析构函数的基类,一个派生类,它继承自基类,并没有定义析构函数.创建派生类的实例,使该实例的全部引用走出去的范围,然后迫使垃圾收集表明,当派生类的实例被敲定在基类中定义的析构函数被调用.
我的问题是"析构函数不是继承的"实际意味着什么,因为虽然你不能显式地调用析构函数,但是继承链中的析构函数会被自动调用,并且即使派生类没有定义析构函数,也会调用基类析构函数?
是否与垃圾收集器而不是C#语言/编译器实现的最终化有些微妙的语义区别?
编辑1:
虽然C#语言规范还声明"实例构造函数不是继承的",但与构造函数相关的行为与析构函数明显不同,并且更符合IMO与"未继承"的术语,如下例所示:
public class ConstructorTestBase
{
public ConstructorTestBase(string exampleParam)
{
}
}
public class ConstructorTest: ConstructorTestBase
{
public ConstructorTest(int testParam)
: base(string.Empty)
{
}
}
...
// The following is valid since there is a derived class constructor defined that
// accepts an integer parmameter.
ConstructorTest test1 = new ConstructorTest(5);
// The following is not valid since the base class constructor is not inherited
// by the …Run Code Online (Sandbox Code Playgroud) 背景
我有一个与WCF服务交互的ASP.NET Web应用程序.Web应用程序和WCF服务由我控制.ASP.NET Web应用程序使用ASP.NET成员资格提供程序模型的自定义实现(密码以散列形式存储)来验证登录Web应用程序的用户.ASP.NET Web应用程序和WCF服务都可以访问相同的成员资格数据库.
由于用户只提供一次密码,我不想将密码存储在任何地方或者通过反复要求他们重新提供密码来惹恼他们,我需要一种适当的机制来通过WCF服务对用户进行身份验证.
基于我看到的其他问题和答案,我正在考虑一种"登录会话"方法,当用户最初登录到Web应用程序时,将在自定义成员资格数据库中创建登录会话,并确定登录会话通过GUID,并在一段时间不活动后自动过期.Web应用程序将为每个登录用户"记住"登录会话GUID(存储在Forms Authentication Ticket或会话中).
WCF服务还将提供其自己的登录操作,接受用户名和密码,并返回如上所述的登录会话GUID.
然后,WCF服务将接受所有其他操作的登录会话GUID,并在允许操作继续之前验证GUID表示尚未过期的有效登录会话.
我已经做了相当多的背景阅读,并且有很多关于直接使用UserName客户端凭证类型的材料,但这需要Web应用程序记住用户的密码,这看起来不是很好我的想法.
我已经完成了一些研究,并在MSDN上找到了材料,但这似乎是很多努力来实现(至少对我来说)似乎是一个非常常见的使用场景.
题
上面描述的"登录会话"的一般方法是否合理?
如果是这样,实现它的最佳方法是什么?
如果没有,你能建议一个替代方案吗?