MSDN将System.Enum定义为抽象类:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
Run Code Online (Sandbox Code Playgroud)
并且MSDN也对抽象类做出了这样的陈述:
无法实例化抽象类.抽象类的目的是提供多个派生类可以共享的基类的公共定义.
但我根本无法从System.Enum派生.根据Jeffery Richter在他的书"CLR via C#"中的说法,C#编译器禁止这种推导.
我检查了System.Enum的成员,其中大多数是静态的,这是合理的,因为它无法实例化,静态方法不需要调用对象实例.但是也有一些实例方法,比如GetHashCode()和GetTypeCode().
所以,我的第一个问题是,如果System.Enum无法实例化或派生,那么如何调用这些实例方法呢?这不是一种悖论吗?
我知道我可以使用以下方法来调用这些实例方法,但为什么呢?是否创建了某种System.Enum或派生类型对象实例?什么时候?和谁?
public enum Days:byte { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
Days d = Days.Friday;
d.GetTypeCode();
d.GetHashCode();
Run Code Online (Sandbox Code Playgroud) 我已经读过一些模糊的陈述,即虚拟继承不提供COM所需的内存结构,因此我们必须使用普通继承.发明虚拟继承来处理钻石问题.
有人能告诉我这两种继承方法之间存储结构细节差异的说明吗?而虚拟继承不适合COM 的关键原因.一张照片最好.
非常感谢.
我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?
我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?
由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?
对于任何回复,我表示深深的感谢.
我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?
我正在阅读<Windows via C/C++>,这里有一些引用.
创建进程并为其提供地址空间时,此可用地址空间的大部分是空闲的或未分配的.要使用此地址空间的一部分,必须通过调用VirtualAlloc在其中分配区域.分配区域的行为称为保留.
要使用保留的地址空间区域,必须分配物理存储,然后将此存储映射到保留区域.此过程称为提交物理存储.
保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.
以下是几个问题:
为什么在使用内存时我们需要遵循reserve-comit范式?即为什么我们需要遵循这个两步范式,而不是直接分配一些物理内存并使用它?
如果从系统的分页文件中分配了提交到某个区域的物理存储,为什么我们需要RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到RAM(通过分页机制),RAM页面应该由分页文件支持.
也许这个问题可以通过解释以下两个方面来回答:
保留做什么?
承诺做什么?
以下来自<Windows via C/C++ 5th edition>的引文让我感到困惑.
...最好将物理存储视为存储在磁盘驱动器上的页面文件中的数据.因此,当应用程序通过调用VirtualAlloc函数将物理存储提交到地址空间区域时, 实际上会从硬盘上的文件分配空间.
保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.
那么,RAM在哪里?如果我将机器配置为没有页面文件怎么办?
我正在学习python,但是我对以下结果感到有些困惑.
In [41]: 1 == True
Out[41]: True
In [42]: if(1):
...: print('111')
...:
111
In [43]: ... == True
Out[43]: False <===== why this is False while '1 == True' is True in previous sample
In [44]: if (...): <==== here ... just behaves like True
...: print('...')
...:
...
Run Code Online (Sandbox Code Playgroud)
根据文档,...
真值为True.
但我仍觉得上面的代码有点不一致.
......更有趣的事情:
In [48]: 2==True
Out[48]: False <===== why 1==True returns True while 2==True returns False?
In [49]: if(2):
...: print('222')
...:
222
Run Code Online (Sandbox Code Playgroud) 当我制作一个小型的.NET WinForm应用程序时,我遇到了"漫游user.config".我知道"漫游"这个词的字面含义,但"漫游"的技术定义是什么.有人可以给我一个场景解释吗?非常感谢!8 ^ d
我编写了以下代码用于某些测试,输出超出了我的预期.
public enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
Console.WriteLine(typeof(System.Enum).IsValueType.ToString()); // False
Console.WriteLine(typeof(Days).IsValueType.ToString()); // True
Run Code Online (Sandbox Code Playgroud)
所以我用Reflector检查Type.IsValueType属性的实现.这是:
public bool get_IsValueType()
{
return this.IsValueTypeImpl();
}
protected virtual bool IsValueTypeImpl()
{
Type type = this;
return (((type != valueType) && (type != enumType)) && this.IsSubclassOf(valueType));
}
Run Code Online (Sandbox Code Playgroud)
在MSDN中,System.Enum定义为:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable,
IFormattable, IConvertible
Run Code Online (Sandbox Code Playgroud)
那么为什么IsValueType以这种方式实现呢?为什么检测到enumType?
我正在开发一个COM DLL并尝试使用__declspec(dllexport)导出DllGetClassObject()方法.
这里是我的报关表:
extern "C" HRESULT __declspec(dllexport) __stdcall DllGetClassObject(REFCLSID rclsid,
REFIID riid, void** ppv)
Run Code Online (Sandbox Code Playgroud)
但我一直得到这个错误:
error C2375: 'DllGetClassObject' : redefinition; different linkage
Run Code Online (Sandbox Code Playgroud)
所以我尝试检查所有DllGetClassObject定义的出现.于是在ObjBase.h中找到了以下一个.
STDAPI DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID FAR* ppv);
Run Code Online (Sandbox Code Playgroud)
事实证明,STDAPI是这样的:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
Run Code Online (Sandbox Code Playgroud)
换句话说,它是这样的:
#define STDAPI extern "C" HRESULT __stdcall
Run Code Online (Sandbox Code Playgroud)
根据MSDN:
要导出函数,如果指定了关键字,__ declspec(dllexport)关键字必须出现在calling-convention关键字的左侧.
但我之前提到的声明没有奏效.
我用不同的方法名称测试了我的声明,如下所示:
extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
并且此方法已成功导出.所以这些说明符可以一起使用.似乎Visual C++编译器将STDAPI和extern"C"HRESULT …
我知道这些方法来创建一个实例:
什么时候使用它们?他们有什么不同?什么是展开呢?打开什么?为什么其他两种方法也没有打开?
目前,我有以下医学类比:
关于Unwrap操作,我有一些模糊的感觉,但我不会发布它,直到它更清楚.
CORS的Wikipedia页面中提到了跨站点脚本(XSS).但我不知道它们是如何相关的.CORS和XSS之间有什么联系?