2010-07-02 5 views
9

У меня есть частичный класс, как этотЧастичный класс с методом одноименных

public partial class ABC 
{ 
    public string GetName() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    }  
} 

public partial class ABC 
{ 
    public string GetSex() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    }  
} 

Как эти два класса слияние во время сборки? Пожалуйста, объясните мне.

ответ

16

При попытке скомпилировать этот код будет ошибка времени !

Что происходит во время сборки является compiler сочетает в себе все элементы, определенные в все частные определения класса в один. Затем он попытается скомпилировать его обычным способом.

В вашем случае это будет вызовет ошибку упоминая вы уже определили метод с тем же именем.

6

Он не компилируется, поскольку у вас не может быть двух методов с одним и тем же именем в одном классе.

+0

Если 2different пользователь, работающий над этими классами, они могут сделать эту ошибку. Как я могу предотвратить это. – Pankaj

+6

@Pankaj: заставить их разговаривать друг с другом =) – Jens

+1

@Pakaj - благодаря хорошей системе непрерывной интеграции, которая не позволяет им проверять код, который не будет компилироваться. – cjk

2

Даже помимо синтаксических ошибок ваш код не будет компилироваться. Вы получите следующее сообщение об ошибке:

Type 'MyNamespace.ABC' already defines a member called 'GetAge' with the same parameter types

Это потому, что компилятор будет объединить все части частичного класса в один класс, как Раздел 10.2 # Спецификации языкаC объясняющий:

With the exception of partial methods (§10.2.7), the set of members of a type declared in multiple parts is simply the union of the set of members declared in each part. The bodies of all parts of the type declaration share the same declaration space (§3.3), and the scope of each member (§3.7) extends to the bodies of all the parts.

C# не позволяет использовать методы с одинаковыми именами и с одинаковым числом и типами аргументов в одном классе. Об этом говорится в разделе 1.6.6 спецификации:

The signature of a method must be unique in the class in which the method is declared. The signature of a method consists of the name of the method, the number of type parameters and the number, modifiers, and types of its parameters. The signature of a method does not include the return type.

Существует один вариант, хотя, чтобы добавить объявление метода в одной части частичного класса и реализации в другой: Частичные методы. Вы можете прочитать о них в блоге Эрика LIPPERT на эту тему:

What's the difference between a partial method and a partial class?

0

Они не сливаются: вы будете иметь ошибку во время компиляции.

0

Они не будут сливаться: ошибка времени компиляции. Они могут слиться в вашем случае, если вы случайно поместите их в разные пространства имен.

0

Препроцессор (или, возможно, компилятор) сканирует вашу папку проекта во время одного из его прогонов и проверяет имена классов, которые находятся в проекте (или, если точнее, сборка). Затем он отмечает частичные классы и проверяет, существуют ли их множественные определения.
Задать вопрос Эрику Липперту о деталях. Затем он объединяет методы, комментарии, атрибуты, элементы, интерфейсы и т. Д. HAve читается в спецификации C# lang. Ваши методы не имеют частичного modfier, так как ребята передо мной заметили, он не будет компилироваться.

1

Частичные классы объединяются во время компиляции. Компиляторы ищут частичные классы и интегрируют их во время компиляции. Он просто объединяет «два» частичных класса в один класс. В CLR не выполняется никаких изменений для реализации частичных классов. Вы можете рассматривать это как слияние «двух» частичных классов.

Например, для кода вы будете иметь:

public partial class ABC 
{ 
    public string GetName() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    } 

    public string GetSex() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    } 
} 

И это даст вам ошибку, потому что вы не можете иметь 2 методы с тем же именем и подписью (см GetAge метод).

0

Попробуйте это:

public class ABC 
{ 
    public string GetName() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    } 
} 

public partial class ABC 
{ 
    public string GetSex() 
    { 
    //some code here 
    } 

    public string GetAge() 
    { 
    //some code here 
    }  
} 

Оставьте частичное из первого класса!

+0

Этот код не будет работать, даст следующую ошибку: «Отсутствует частичный модификатор при объявлении типа« ABC », существует другое частичное объявление этого типа» –