2013-05-18 3 views
2

В настоящее время я пытаюсь построить объект, который происходит из другого объекта, но перед вызовом базового конструктора я хотел бы сделать несколько проверок аргументов.Использование: base() в конструкторе

public FuelMotorCycle(string owner) : base(owner) 
{ 
    argumentValidation(owner); 
} 

Теперь я понял, что изначально базовый конструктор вызывается первым, есть способ, я могу назвать это только после того, как методы argumentValidation?

+2

«Основание» будет происходить в первую очередь. –

+4

Вы всегда можете нажать F5 и сами убедиться. –

+1

Дубликат: [Порядок выполнения конструктора C#] (http://stackoverflow.com/a/1882778/1945631) –

ответ

4

Теперь я понял, что изначально базовый конструктор вызывается первым, есть способ, которым я могу назвать его только после метода аргументаValidation?

Нет, по крайней мере, не очень.

Но вы можете использовать небольшой обходной путь где у вас есть static метод, который принимает аргумент, проверяет его и возвращает его, если он действует или бросает исключение, если это не так:

private static string argumentValidate(string owner) 
{ 
    if (/* validation logic for owner */) return owner; 
    else throw new YourInvalidArgumentException(); 
} 

Тогда же производный конструктор класса передать аргументы с помощью этого метода, прежде чем давать их в base конструктор:

public FuelMotorCycle(string owner) : base(argumentValidate(owner)) 
{ 
} 
2

Сначала будет вызываться конструктор базового класса, тогда все в теле метода будет выполнено.

5

Сначала будет вызываться базовый конструктор.

В этом примере:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dc = new DerivedClass(); 
     System.Console.Read(); 
    } 
} 

class BaseClass 
{ 
    public BaseClass(){ 
     System.Console.WriteLine("base"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
     : base() 
    { 
     System.Console.WriteLine("derived"); 
    } 
} 

будет выводить:

base 
derived 
1

База используется в конструкторах. Конструктор производного класса требуется для вызова конструктора из его базового класса. Когда конструктор по умолчанию отсутствует, конструктор базы данных может, с базой, ссылаться. Базовый класс конструкторы вызываются, прежде чем полученные Конструкторы класса, но полученные Инициализаторы класса дозвонились до того базового класса initializers.I также предлагаем вам посмотреть contructor execution from msdn

using System; 

public class A // This is the base class. 
{ 
    public A(int value) 
    { 
    // Executes some code in the constructor. 
    Console.WriteLine("Base constructor A()"); 
    } 
} 

public class B : A // This class derives from the previous class. 
{ 
    public B(int value) 
    : base(value) 
    { 
    // The base constructor is called first. 
    // ... Then this code is executed. 
    Console.WriteLine("Derived constructor B()"); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
    // Create a new instance of class A, which is the base class. 
    // ... Then create an instance of B, which executes the base constructor. 
    A a = new A(0); 
    B b = new B(1); 
    } 
} 

Вот результат:

Base constructor A() 
Base constructor A() 
Derived constructor B() 
1

в зависимости от того, какой метод проверки, вы можете быть в состоянии д o что-то вроде:

public FuelMotorCycle(string owner) 
    : base(argumentValidationReturningValidatedArg(owner)) 
{ 
} 

Если функция проверки является статическим методом, например, это должно быть хорошо.

Смежные вопросы