无法为属性分配新值

L. *_*rdt 1 c# properties

我说的是房产PageSettings.PrinterResolution.根据MSDN,该属性具有setter与属性相同的属性PrinterResolution.X,即使我无法为其设置新值.该属性仍然包含它的早期值,而不是新分配的值.

PrintDocument pd = new PrintDocument();    
//assigning a printer to `pd`, etc...

//premise: pd.DefaultPageSettings.PrinterResolution.X has currently the value 200
Run Code Online (Sandbox Code Playgroud)

现在我尝试为以下内容分配一个新intX:

pd.DefaultPageSettings.PrinterResolution.X = 300;
Run Code Online (Sandbox Code Playgroud)

但检查后它的值pd.DefaultPageSettings.PrinterResolution.X仍然包含200.我只是想出了分配新的PrinterResolution与设定值对象X,并Ypd.DefaultPageSettings.PrinterResolution该值更改为我的需求.

PrinterResolution changedRes = new PrinterResolution();
changedRes.X = 200;
changedRes.Y = 200;

pd.DefaultPageSettings.PrinterResolution = changedRes;
Run Code Online (Sandbox Code Playgroud)

那么为什么我不能设置属性的值呢?特别是为什么有记录,setter即使它不是"可用的".

Ren*_*ogt 5

如果您查看参考源,PageSettings您会看到PrinterResolution始终从API重新请求(只要您不PrinterResolution手动设置属性):

public PrinterResolution PrinterResolution {
    [ResourceExposure(ResourceScope.None)]
    [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)]
    get {
        if (printerResolution == null) {
            IntSecurity.AllPrintingAndUnmanagedCode.Assert();

            IntPtr modeHandle = printerSettings.GetHdevmode();
            IntPtr modePointer = SafeNativeMethods.GlobalLock(new HandleRef(this, modeHandle));
            SafeNativeMethods.DEVMODE mode = (SafeNativeMethods.DEVMODE) UnsafeNativeMethods.PtrToStructure(modePointer, typeof(SafeNativeMethods.DEVMODE));

            PrinterResolution result = PrinterResolutionFromMode(mode);

            SafeNativeMethods.GlobalUnlock(new HandleRef(this, modeHandle));
            SafeNativeMethods.GlobalFree(new HandleRef(this, modeHandle));

            return result;
        }
        else
            return printerResolution;
    }
    set {
        printerResolution = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,只要您不PageSettings.PrinterResolution手动设置,PrinterResolution每次访问PageSettings.PrinterResolutiongetter时都会从API加载一个新实例.这个新实例X再次包含原始值.您X之前设置的实例将被丢弃.

至于为什么我对此不太了解.