[C#] C # 부분 클래스를 사용하는 것이 언제 적절한가요?

누군가 내가 왜 그것을 사용하는지와 프로세스에서 어떤 이점을 얻을 수 있는지에 대한 개요를 나에게 줄 수 있는지 궁금합니다.



답변

부분 클래스의 가장 큰 사용은 코드 생성기 / 디자이너의 삶을 더 쉽게 만드는 것입니다. 부분 클래스를 사용하면 생성기가 생성해야하는 코드를 간단히 방출 할 수 있으며 파일에 대한 사용자 편집을 처리 할 필요가 없습니다. 마찬가지로 사용자는 두 번째 부분 클래스를 사용하여 새 멤버로 클래스에 주석을 달 수 있습니다. 이것은 관심사 분리를위한 매우 깨끗한 프레임 워크를 제공합니다.

그것을 보는 더 좋은 방법은 디자이너가 부분 수업 전에 어떻게 기능했는지를 보는 것입니다. WinForms 디자이너는 코드를 수정하지 않는 것에 대한 강력한 말로 지역 내부의 모든 코드를 뱉어냅니다. 나중에 처리하기 위해 생성 된 코드를 찾기 위해 모든 종류의 휴리스틱을 삽입해야했습니다. 이제 designer.cs 파일을 열고 디자이너와 관련된 코드 만 포함하고 있다는 확신을 가질 수 있습니다.


답변

다른 용도는 다른 인터페이스의 구현을 분할하는 것입니다. 예 :

partial class MyClass : IF1, IF2, IF3
{
    // main implementation of MyClass
}


partial class MyClass
{
    // implementation of IF1
}

partial class MyClass
{
    // implementation of IF2
}


답변

다른 답변 외에도 …

나는 신 클래스를 리팩토링하는 데 디딤돌로 도움이된다는 것을 알았습니다. 클래스에 여러 책임이있는 경우 (특히 매우 큰 코드 파일 인 경우) 코드를 구성하고 리팩토링하기위한 첫 번째 패스로 1x 부분 클래스 당 책임을 추가하는 것이 좋습니다.

실제로 실행 동작에 영향을 미치지 않고 코드를 훨씬 더 읽기 쉽게 만들 수 있기 때문에 크게 도움이됩니다. 또한 책임을 쉽게 리팩토링하거나 다른 측면과 밀접하게 관련되어있는시기를 식별하는 데 도움이 될 수 있습니다.

그러나, 분명히 – 이것은 여전히 ​​나쁜 코드입니다. 개발이 끝날 때 여전히 클래스 당 하나의 책임을 원합니다 ( 부분 클래스가 아닌 ). 그것은 단지 디딤돌입니다 🙂


답변

  1. 부분 클래스를 사용하는 다중 개발자 여러 개발자 가 동일한 클래스에서 쉽게 작업 할 수 있습니다.
  2. 코드 생성기 부분 클래스는 주로 코드 생성기에서 서로 다른 문제를 분리하여 사용합니다.
  3. Partial Methods Partial Classes를 사용하면 개발자가 단순히 메소드를 정의하고 다른 개발자가이를 구현할 수있는 Partial 메소드도 정의 할 수 있습니다.
  4. 부분 메소드 선언 만 코드는 메소드 선언으로 만 컴파일되며 메소드 구현이 존재하지 않는 경우 컴파일러는 해당 코드를 안전하게 제거 할 수 있으며 컴파일 시간 오류가 발생하지 않습니다.

    포인트 4를 확인하려면 : winform 프로젝트를 작성하고 Form1 생성자 다음에이 행을 포함시키고 코드를 컴파일하십시오.

    partial void Ontest(string s);

다음은 부분 클래스를 구현할 때 고려해야 할 사항입니다.

  1. 부분 클래스의 각 부분에 부분 키워드를 사용하십시오.
  2. 부분 클래스의 각 부분 이름은 동일해야하지만 부분 클래스의 각 부분에 대한 소스 파일 이름은 다를 수 있습니다.
  3. 부분 클래스의 모든 부분은 동일한 네임 스페이스에 있어야합니다.
  4. 부분 클래스의 각 부분은 동일한 어셈블리 또는 DLL에 있어야합니다. 즉, 다른 클래스 라이브러리 프로젝트의 소스 파일에서 부분 클래스를 만들 수 없습니다.
  5. 부분 클래스의 각 부분은 동일한 액세스 가능성을 가져야합니다. (예 : 비공개, 공개 또는 보호)
  6. 부분 클래스에서 클래스 또는 인터페이스를 상속하면 해당 부분 클래스의 모든 부분에서 상속됩니다.
  7. 부분 클래스의 일부가 봉인 된 경우 전체 클래스가 봉인됩니다.
  8. 부분 클래스의 일부가 추상 인 경우 전체 클래스는 추상 클래스로 간주됩니다.

답변

한 가지 유용한 용도는 생성 된 코드를 동일한 클래스에 속하는 수작업 코드와 분리하는 것입니다.

예를 들어 LINQ to SQL은 부분 클래스를 사용하므로 다 대다 관계와 같은 특정 기능 부분을 직접 구현할 수 있으며 코드를 다시 생성 할 때 해당 사용자 지정 코드 부분을 덮어 쓰지 않습니다.

WinForms 코드도 마찬가지입니다. 모든 Designer 생성 코드는 일반적으로 손대지 않는 하나의 파일로 들어갑니다. 직접 작성한 코드는 다른 파일로 들어갑니다. 이렇게하면 Designer에서 무언가를 변경할 때 변경 사항이 사라지지 않습니다.


답변

Partial Class가 자동 코드 생성에 사용되는 것은 사실이며, 한 번의 사용으로 수천 줄의 코드를 가진 큰 클래스 파일을 유지할 수 있습니다. 수업이 10 만 줄로 끝나는 것을 결코 알지 못하고 다른 이름으로 새 수업을 만들고 싶지 않습니다.

public partial class Product
{
    // 50 business logic embedded in methods and properties..
}

public partial class Product
{
    // another 50 business logic embedded in methods and properties..
}
//finally compile with product.class file.

또 다른 가능한 용도는 둘 이상의 개발자가 서로 다른 장소에 저장된 동일한 클래스에서 작업 할 수 있다는 것입니다. 사람들은 웃을 지 모르지만 때로는 소수 일 수 있다는 것을 결코 알지 못합니다.

Product1.cs

public partial class Product
{
    //you are writing the business logic for fast moving product
}

Product2.cs

public partial class Product
{
    // Another developer writing some business logic...
}

이해가 되길 바랍니다!


답변

부분 클래스는 여러 파일에 걸쳐 있습니다.

C # 클래스 선언에서 부분 수정자를 어떻게 사용할 수 있습니까?

부분 클래스를 사용하면 클래스를 여러 파일로 물리적으로 분리 할 수 ​​있습니다. 이것은 종종 코드 생성기에 의해 수행됩니다.

일반 C # 클래스를 사용하면 동일한 프로젝트에서 두 개의 개별 파일로 클래스를 선언 할 수 없습니다. 그러나 partial수정자를 사용하면 가능합니다.

한 파일을 일반적으로 편집하고 다른 파일을 시스템에서 생성하거나 거의 편집하지 않는 경우에 유용합니다.

다음은 명확히하는 예입니다.

class Program
{
    static void Main()
    {
        A.A1();
        A.A2();
    }
}

파일 A1.cs의 내용 : C #

using System;

partial class A
{
    public static void A1()
    {
        Console.WriteLine("A1");
    }
}

파일 A2.cs의 내용 : C #

using System;

partial class A
{
    public static void A2()
    {
        Console.WriteLine("A2");
    }
}

산출:

A1
A2

여기에 부분이 필요합니다.

partial수정자를 제거하면 이 텍스트를 포함하는 오류가 발생합니다.

[네임 스페이스 ‘ <global namespace>‘에는 이미 ‘ ‘에 대한 정의가 포함되어 있습니다 A.

팁:

이 문제를 해결하려면 partial키워드 를 사용 하거나 클래스 이름 중 하나를 변경하십시오.

C # 컴파일러는 부분 클래스를 어떻게 처리합니까?

IL 디스어셈블러를 사용하여 위 프로그램을 분해하면 A1.cs 및 A2.cs 파일이 제거 된 것을 볼 수 있습니다. 클래스 A가 있음을 알 수 있습니다.

클래스 A는 동일한 코드 블록에 메소드 A1 및 A2를 포함합니다. 두 클래스는 하나로 통합되었습니다.

A1.cs 및 A2.cs의 컴파일 결과 : C #

internal class A
{
    // Methods
    public static void A1()
    {
        Console.WriteLine("A1");
    }

    public static void A2()
    {
        Console.WriteLine("A2");
    }
}

요약

  • 부분 클래스는 특정 C # 프로그래밍 상황을 단순화 할 수 있습니다.
  • Windows Forms / WPF 프로그램을 만들 때 Visual Studio에서 자주 사용됩니다.
  • 기계 생성 C # 코드는 별개입니다.
  • 또는 전체 설명을 여기에서 찾을 수 있습니다 .