簡體   English   中英

MSOCAF驗證-不要在構造函數中調用可重寫的方法

[英]MSOCAF Verification - Do not call overridable methods in constructors

我在MSOCAF中有此錯誤:

“ ExcelChart.ExcelChart(ExcelDrawings,XmlNode,Uri,PackagePart,XmlDocument,XmlNode)”包含一個調用鏈,該調用鏈導致對該類定義的虛擬方法的調用。 查看以下調用堆棧以了解意外的結果:

ExcelChart..ctor(ExcelDrawings,XmlNode,Uri,PackagePart,XmlDocument,XmlNode)ExcelChart.InitChartLoad(ExcelDrawings,XmlNode):Voi ExcelChart.GetChartType(String):eChartType

構造函數:

internal ExcelChart(ExcelDrawings drawings, XmlNode node, Uri uriChart, PackagePart part, XmlDocument chartXml, XmlNode chartNode) :
       base(drawings, node, "xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr/@name")
   {
       UriChart = uriChart;
       Part = part;
       ChartXml = chartXml;
       _chartNode = chartNode;
       InitChartLoad(drawings, chartNode);
       ChartType = GetChartType(chartNode.LocalName);
   }

和該行的錯誤:

XmlNode _chartNode = null;
    internal XmlNode ChartNode
    {
        get
        {
            return _chartNode;
        }
    }

兩種方法:

private void InitChartLoad(ExcelDrawings drawings, XmlNode chartNode)
   {
       //SetChartType();
       bool isPivot = false;
       Init(drawings, chartNode);
       _chartSeries = new ExcelChartSeries(this, drawings.NameSpaceManager, _chartNode, isPivot /*ChartXml.SelectSingleNode(_chartPath, drawings.NameSpaceManager)*/);
       LoadAxis();
   }

internal virtual eChartType GetChartType(string name)
   {

       switch (name)
       {
           case "area3DChart":
               if(Grouping==eGrouping.Stacked)
               {
                   return eChartType.AreaStacked3D;
               }
               else if (Grouping == eGrouping.PercentStacked)
               {
                   return eChartType.AreaStacked1003D;
               }
               else
               {
                   return eChartType.Area3D;
               }
           case "areaChart":
               if (Grouping == eGrouping.Stacked)
               {
                   return eChartType.AreaStacked;
               }
               else if (Grouping == eGrouping.PercentStacked)
               {
                   return eChartType.AreaStacked100;
               }
               else
               {
                   return eChartType.Area;
               }
           case "bubbleChart":
               return eChartType.Bubble;
           case "doughnutChart":
               return eChartType.Doughnut;
           case "pie3DChart":
               return eChartType.Pie3D;
           case "pieChart":
               return eChartType.Pie;
           case "radarChart":
               return eChartType.Radar;
           case "scatterChart":
               return eChartType.XYScatter;
           case "surface3DChart":
           case "surfaceChart":
               return eChartType.Surface;
           case "stockChart":
               return eChartType.StockHLC;
           default:
               return 0;
       }           
   }

我在CodePlex中找到了此代碼,我嘗試解決MSOCAF返回的所有錯誤

構造函數ExcelChart()調用虛擬方法GetChartType() 派生類可以重寫此方法,並使用在基類(ExcelChart)執行其構造函數時不存在或未初始化的數據。 基類的實現者無法知道或防止其類派生的后續代碼,並且從基類派生的人可能不知道基類ctor調用了他或她真正想要重寫的虛方法。

這就是為什么編碼准則通常禁止在ctor中調用虛擬方法。

請注意,虛擬方法的這種實現不同於C ++,在C ++中,調用這些虛擬方法位於ctor正在執行的類的vtable中。 也就是說,在嵌套ctor中,每個ctor都可以調用不同版本的“相同”虛擬方法。 相反,在C#中,總是調用繼承鏈中的“最派生”實現。 盡管這可能更簡單且更可預測,但它在某種程度上與繼承的概念背道而馳,並導致訪問基類不知道的數據的危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM