Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#在Try..Catch之后使用未分配的局部变量_C#_.net_Interop - Fatal编程技术网

c#在Try..Catch之后使用未分配的局部变量

c#在Try..Catch之后使用未分配的局部变量,c#,.net,interop,C#,.net,Interop,我正在使用下面的代码获取MS Word的一个运行实例 我现在有一个关于“使用未分配的局部变量“oWord”的编译问题 这是我的密码: Microsoft.Office.Interop.Word._Application oWord ; try { // Is Word running? oWord = Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; // App

我正在使用下面的代码获取MS Word的一个运行实例

我现在有一个关于“使用未分配的局部变量“oWord”的编译问题

这是我的密码:

Microsoft.Office.Interop.Word._Application oWord ; 

try
{
// Is Word running?
oWord = Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; // ApplicationClass;
}
catch (COMException ce)
{
if (ce.ErrorCode == unchecked((int)0x800401E3))
    // No, Word not in ROT, start a new instance
    oWord = new Microsoft.Office.Interop.Word.Application();
}
// Use instance referened by _WordApp 

oWord.ScreenUpdating = false; // < PROBLEM HERE

object objDefaultBehaviorWord8 = WdDefaultTableBehavior.wdWord8TableBehavior;
object objAutoFitFixed = WdAutoFitBehavior.wdAutoFitFixed;

//MAKING THE APPLICATION VISIBLE
oWord.Visible = Properties.Settings.Default.DebugMode;
oWord.DisplayAlerts = WdAlertLevel.wdAlertsNone;

Microsoft.Office.Interop.Word.\u应用程序oWord;
尝试
{
//Word正在运行吗?
oWord=Marshal.GetActiveObject(“Word.Application”)作为Microsoft.Office.Interop.Word.Application;//ApplicationClass;
}
捕获(COMException ce)
{
如果(ce.ErrorCode==未选中((int)0x800401E3))
//不,字不在腐,开始一个新的实例
oWord=新的Microsoft.Office.Interop.Word.Application();
}
//使用由_WordApp引用的实例
oWord.ScreenUpdate=false;//<这里有问题
对象objDefaultBehaviorWord8=WdDefaultTableBehavior.wdWord8TableBehavior;
object objAutoFitFixed=WdAutoFitBehavior.wdAutoFitFixed;
//使应用程序可见
oWord.Visible=Properties.Settings.Default.DebugMode;
oWord.displayerts=WdAlertLevel.wdAlertsNone;
但在我看来,oWord是赋值的,我猜编译器正在查看我的Try..Catch块,并说我有未赋值的oWord


那么,正确的分配方法是什么呢?

如果
封送.GetActiveObject
调用失败,可能永远不会分配它,但错误代码不是
未选中((int)0x800401E3)

首次声明时,需要将oWord设置为:

Microsoft.Office.Interop.Word._Application oWord = null;

我可能会选择后者。这也消除了进一步进行空检查的需要,现在您确实应该进行空检查,因为如果try/catch块中捕获到异常,您还没有完全中止


(话虽如此,如果这样做实际上会在Word尚未运行时启动它,请使用第一个选项,然后确保在try/catch之后
oWord
不仍然为null。)

如果
Marshal.GetActiveObject
调用失败,则可能永远不会分配它,但错误代码不是
未选中((int)0x800401E3)

首次声明时,需要将oWord设置为:

Microsoft.Office.Interop.Word._Application oWord = null;

我可能会选择后者。这也消除了进一步进行空检查的需要,现在您确实应该进行空检查,因为如果try/catch块中捕获到异常,您还没有完全中止


(话虽如此,如果这样做实际上会在Word尚未运行时启动它,请使用第一个选项,然后确保在try/catch之后,
oWord
不仍然为null。)

只需为其指定一个默认值
null

Microsoft.Office.Interop.Word._Application oWord = null;

这是必要的,因为代码当前在catch{}块的
if语句
中为其赋值,因此
oWord
可能永远不会得到没有初始/默认值的值

只需为其分配一个默认值
null
值:

Microsoft.Office.Interop.Word._Application oWord = null;
Microsoft.Office.Interop.Word._Application oWord; 
try
{
    oWord = Marshal.GetActiveObject("Word.Application") as
        Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
    if (ce.ErrorCode == unchecked((int)0x800401E3))
        oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
这是必要的,因为代码当前在catch{}块的
if语句
中为其赋值,因此
oWord
可能永远不会得到没有初始/默认值的值

Microsoft.Office.Interop.Word._Application oWord; 
try
{
    oWord = Marshal.GetActiveObject("Word.Application") as
        Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
    if (ce.ErrorCode == unchecked((int)0x800401E3))
        oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
让我们看看为什么编译器会告诉您,在执行此代码后,
oWord
可能不会被赋值

  • 如果
    try
    中的代码毫无例外地执行,则必须分配
    oWord
  • 或者,如果该代码引发异常,它可能未经处理,在这种情况下,它会传播到上述代码之外
  • 或者,如果try中的代码抛出
    COMException
    ,它将被捕获。如果错误代码为
    0x800401E31
    ,则分配
    oWord
  • 或者,如果错误代码不是
    0x800401E3
    ,则从不分配
    oWord
  • 我们可以为您的代码添加注释,以更清楚地演示这一点:

    Microsoft.Office.Interop.Word._Application oWord; 
    try
    {
        oWord = Marshal.GetActiveObject("Word.Application") as
            Microsoft.Office.Interop.Word.Application;
    }
    catch (COMException ce)
    {
        // oWord still not initialized ....
        if (ce.ErrorCode == unchecked((int)0x800401E3))
            oWord = new Microsoft.Office.Interop.Word.Application();
        else
            ; // .... and still not initialized ....
    }
    oWord.ScreenUpdating = false;
    

    在我看来,处理这个问题的最简单方法是重新抛出异常

    Microsoft.Office.Interop.Word._Application oWord; 
    try
    {
        oWord = Marshal.GetActiveObject("Word.Application") as
            Microsoft.Office.Interop.Word.Application;
    }
    catch (COMException ce)
    {
        if (ce.ErrorCode != unchecked((int)0x800401E3))
            throw;
        oWord = new Microsoft.Office.Interop.Word.Application();
    }
    oWord.ScreenUpdating = false;
    
    这避免了需要将变量初始化为
    null
    ,然后测试它是否仍然为
    null

    更重要的是,它显式地处理代码无法处理的错误条件。即除了
    MK_E_UNAVAILABLE
    之外的COM错误

    让我们看看为什么编译器会告诉您,在执行此代码后,
    oWord
    可能不会被赋值

  • 如果
    try
    中的代码毫无例外地执行,则必须分配
    oWord
  • 或者,如果该代码引发异常,它可能未经处理,在这种情况下,它会传播到上述代码之外
  • 或者,如果try中的代码抛出
    COMException
    ,它将被捕获。如果错误代码为
    0x800401E31
    ,则分配
    oWord
  • 或者,如果错误代码不是
    0x800401E3
    ,则从不分配
    oWord
  • 我们可以为您的代码添加注释,以更清楚地演示这一点:

    Microsoft.Office.Interop.Word._Application oWord; 
    try
    {
        oWord = Marshal.GetActiveObject("Word.Application") as
            Microsoft.Office.Interop.Word.Application;
    }
    catch (COMException ce)
    {
        // oWord still not initialized ....
        if (ce.ErrorCode == unchecked((int)0x800401E3))
            oWord = new Microsoft.Office.Interop.Word.Application();
        else
            ; // .... and still not initialized ....
    }
    oWord.ScreenUpdating = false;
    

    在我看来,处理这个问题的最简单方法是重新抛出异常

    Microsoft.Office.Interop.Word._Application oWord; 
    try
    {
        oWord = Marshal.GetActiveObject("Word.Application") as
            Microsoft.Office.Interop.Word.Application;
    }
    catch (COMException ce)
    {
        if (ce.ErrorCode != unchecked((int)0x800401E3))
            throw;
        oWord = new Microsoft.Office.Interop.Word.Application();
    }
    oWord.ScreenUpdating = false;
    
    这避免了需要将变量初始化为
    null
    ,然后测试它是否仍然为
    null


    更重要的是,它显式地处理代码无法处理的错误条件。即除了
    MK_E_UNAVAILABLE
    Microsoft.Office.Interop.Word.\u Application oWord=null
    if
    计算为false时,
    if
    有什么值?
    Microsoft.Office.Interop.Word.\u Application oWord=null
    if
    计算结果为false?我认为这里的作用域不相关。问题只是局部变量可能没有赋值。我正在更改我的答案以表示
    if
    语句。在我看来,@Anna也遗漏了处理除
    MK\u E\u UNAVAILABLE
    之外的任何COM错误。初始化为
    null
    只会导致编译时错误