C#报”TargetException”的原因以及解决办法

  • Post category:C#

TargetException在.NET中经常被用来表示成员调用失败的情况,它通常表明一个方法或属性无法被访问或调用。一些常见的原因包括:

  1. 访问权限不足:如果试图访问私有成员,或者尝试对受保护的成员进行访问,就会触发TargetException。
    解决方法:确保正确使用访问修饰符,访问受保护的属性或方法时正确的实例化类。

  2. null参考:如果将null作为实例调用方法或属性,就会触发TargetException。
    解决方法:在调用方法或属性之前检查变量是否为空,或采用可空类型。

下面是两个示例用来说明TargetException的原因和解决方法:

  1. 示例1:访问受保护的属性时引发TargetException
public class BaseClass
{
    protected int myValue = 42;
}

public class DerivedClass : BaseClass
{
    public int GetMyValue()
    {
        return myValue;
    }
}

static void Main(string[] args)
{
    BaseClass baseObj = new BaseClass();
    DerivedClass derivedObj = new DerivedClass();

    // 尝试通过基类访问受保护的属性
    try
    {
        int value = baseObj.myValue;
    }
    catch (TargetException ex)
    {
        Console.WriteLine(ex.Message);
        // 输出:不能访问受保护的成员"myValue"
    }

    // 尝试通过派生类访问受保护的属性
    int result = derivedObj.GetMyValue();
    Console.WriteLine(result);
    // 输出:42
}

在这个例子中,我们创建了一个基类和一个派生类,并尝试通过基类对象访问受保护的成员,这会导致TargetException。为了解决这个问题,我们可以使用派生类对象来访问受保护的属性或方法。

  1. 示例2:使用null参考时引发TargetException
static void Main(string[] args)
{
    string hello = "Hello, world!";
    string nullString = null;

    // 尝试对非空字符串调用StartsWith
    if (hello.StartsWith("Hello"))
    {
        Console.WriteLine("Hello found");
        // 输出:Hello found
    }

    // 尝试对空字符串调用StartsWith
    try
    {
        if (nullString.StartsWith("Hello"))
        {
            Console.WriteLine("Hello found");
        }
    }
    catch (TargetException ex)
    {
        Console.WriteLine(ex.Message);
        // 输出:对象引用未设置为对象的实例。
    }
}

在这个例子中,我们尝试使用一个空引用调用StartsWith方法,这会导致TargetException。为了避免这个问题,我们应该在使用变量之前检查变量是否为空引用。