小编smw*_*dia的帖子

为什么我不能从System.Enum抽象类派生?

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)

.net c#

10
推荐指数
1
解决办法
2050
查看次数

为什么我们不能在COM中使用"虚拟继承"?

我已经读过一些模糊的陈述,即虚拟继承不提供COM所需的内存结构,因此我们必须使用普通继承.发明虚拟继承来处理钻石问题.

有人能告诉我这两种继承方法之间存储结构细节差异的说明吗?而虚拟继承不适合COM 的关键原因.一张照片最好.

非常感谢.

c++ com

10
推荐指数
2
解决办法
2208
查看次数

实模式BIOS例程和保护模式

我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?

我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?

由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?

对于任何回复,我表示深深的感谢.

更新

我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?

x86 assembly operating-system protected-mode x86-16

10
推荐指数
2
解决办法
4312
查看次数

内存预留和提交

我正在阅读<Windows via C/C++>,这里有一些引用.

创建进程并为其提供地址空间时,此可用地址空间的大部分是空闲的或未分配的.要使用此地址空间的一部分,必须通过调用VirtualAlloc在其中分配区域.分配区域的行为称为保留.

要使用保留的地址空间区域,必须分配物理存储,然后将此存储映射到保留区域.此过程称为提交物理存储.

保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.

以下是几个问题:

  • 为什么在使用内存时我们需要遵循reserve-comit范式?即为什么我们需要遵循这个两步范式,而不是直接分配一些物理内存并使用它?

  • 如果从系统的分页文件中分配了提交到某个区域的物理存储,为什么我们需要RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到RAM(通过分页机制),RAM页面应该由分页文件支持.

也许这个问题可以通过解释以下两个方面来回答:

  • 保留做什么?

  • 承诺做什么?

更新 - 1月2日下午2:48 11/23/2010

以下来自<Windows via C/C++ 5th edition>的引文让我感到困惑.

...最好将物理存储视为存储在磁盘驱动器上的页面文件中的数据.因此,当应用程序通过调用VirtualAlloc函数将物理存储提交到地址空间区域时, 实际上会从硬盘上的文件分配空间.

保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.

那么,RAM在哪里?如果我将机器配置为没有页面文件怎么办?

memory windows paging

10
推荐指数
1
解决办法
2094
查看次数

为什么... = = True在Python 3中返回False?

我正在学习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)

python if-statement python-3.x truthiness

10
推荐指数
2
解决办法
3737
查看次数

从技术上讲,"漫游"是什么意思?

当我制作一个小型的.NET WinForm应用程序时,我遇到了"漫游user.config".我知道"漫游"这个词的字面含义,但"漫游"的技术定义是什么.有人可以给我一个场景解释吗?非常感谢!8 ^ d

c#

9
推荐指数
1
解决办法
1615
查看次数

为什么System.Enum不是值类型?

我编写了以下代码用于某些测试,输出超出了我的预期.

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?

.net c#

9
推荐指数
1
解决办法
2672
查看次数

为什么我不能使用__declspec(dllexport)从COM DLL导出DllGetClassObject()?

我正在开发一个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关键字的左侧.

但我之前提到的声明没有奏效.

那么COM DLL 必须def文件导出他们的方法吗?


更新1

我用不同的方法名称测试了我的声明,如下所示:

extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
    return S_OK;
}
Run Code Online (Sandbox Code Playgroud)

并且此方法已成功导出.所以这些说明符可以一起使用.似乎Visual C++编译器将STDAPIextern"C"HRESULT …

c++ com name-decoration

9
推荐指数
1
解决办法
8511
查看次数

何时使用这么多种方法来创建一个类型的实例?

我知道这些方法来创建一个实例:

  • Activator.CreateInstance()
  • AppDomain.CreateInstance()
  • AppDomain.CreateInstanceAndUnwrap()

什么时候使用它们?他们有什么不同?什么是展开呢?打开什么?为什么其他两种方法也没有打开?

更新

目前,我有以下医学类比:

  • Activator.CreateInstance()=外部授精
  • AppDomain.CreateInstance()=自然怀孕/内部人工授精

关于Unwrap操作,我有一些模糊的感觉,但我不会发布它,直到它更清楚.

.net c#

9
推荐指数
2
解决办法
403
查看次数

CORS和XSS有什么联系吗?

CORS的Wikipedia页面中提到了跨站点脚本(XSS).但我不知道它们是如何相关的.CORS和XSS之间有什么联系?

security xss cors web

9
推荐指数
2
解决办法
6178
查看次数