카테고리 없음

[씨#] 한 부분 클래스에 정의 된 함수를 다른 부분 클래스에서 호출 할 수 있습니까?

행복을전해요 2021. 1. 6. 19:40

귀하의 웹 사이트가 미리 컴파일 된 웹 애플리케이션이 아니라 동적으로 컴파일 되기 때문에 발생한 문제라고 생각합니다 .

ASP.NET 페이지에 처음 액세스 할 때 컴파일러는 파일 뒤에있는 코드 만보고 동일한 클래스에 대해 가능한 추가 코드를 찾기 위해 다른 모든 .cs 파일을 검색하지 않습니다. 따라서의 구현을 볼 수 없으므로 display()파일 뒤에있는 코드가 컴파일되지 않습니다.

나는 확실히 당신이하고 싶은 일에 대해 이와 같은 방법을 사용하지 않을 것이다. 그러나 당신 System.Web.UI.Page은 당신의 실제 페이지가 새로운 클래스에서 파생되는 커스텀 클래스를 정의 할 수있다 . 클래스 정의는 App_Code동적으로 컴파일 된 웹 사이트 에 있어야합니다 .

Registration.aspx.cs :

public partial class Web_Pages_Authentication_Login_Management_Registration : MyPage
{
    protected void btnSubmit_Click(object sender, EventArgs e)
        {
                Display();
                    }
                    }
                    

App_Code \ MyPage.cs :

public class MyPage : System.Web.UI.Page
{
    protected void Display()
        {
                // ...
                    }
                    }
                    

어쨌든 : 정적 변수를 사용하는 방식으로 사용해서는 안됩니다. 여러 사람이 동시에 사이트를 사용하는 경우 문제가 발생할 수 있습니다. 솔직히, 당신의 예는 나에게별로 의미가 없습니다. 수행하려는 작업에 대해 더 많은 정보가 있다면이를 수행 할 수있는 최상의 방법을 제공 할 수 있습니다.

귀하의 예제에서 두 번째 파일을 App_Code디렉토리에 넣으면 작동하지 않습니다. 그 결과 정확히 동일한 클래스 이름을 가진 두 개의 클래스가 생성됩니다 (물론 네임 스페이스가 일치하는 경우). 정말 싫어요 :)

-------------------

예, (부분) 클래스에서 메서드를 호출 할 수 있습니다.

부분 클래스는 일부 언어 (예 : C #)의 기능 일뿐입니다. 단일 클래스로 함께 컴파일되므로 IL에는 존재하지 않습니다.

그러나이 병합이 발생하려면 부분 클래스 선언이 완전히 동일해야하므로 까다로울 수 있습니다. 여기 에는 네임 스페이스가 포함 되므로 이것이 문제가 될 수 있습니다.

예를 들어 이것은 단일 클래스가됩니다.

namespace MyNamespace
{
    public partial class MyClass { }
    
        public partial class MyClass { }
        }
        

결과 클래스는 MyNamespace.MyClass입니다. 그러나 이렇게하면 두 가지 다른 클래스가 생성됩니다.

namespace MyNamespace
{
    public partial class MyClass
        {
                public void MyMethod();
                    }
                    }
                    
                    namespace MyOtherNamespace
                    {
                        public partial class MyClass { }
                        }
                        

그러면 MyNamespace.MyClass 및 MyOtherNamespace.MyClass의 두 클래스가 생성됩니다. 이 경우 this.MyMethodMyOtherNamespace.MyClass에서 호출이 작동하지 않습니다.

-------------------

귀하의 질문을 올바르게 이해하면 SAME 클래스에 대한 부분 클래스 정의가 포함 된 두 개의 파일이 있습니다. 권리? 두 개의 다른 클래스가 아닌가요?

두 파일이 동일한 클래스에 대한 것이라면 두 파일이 동일한 네임 스페이스에 정의되어 있고 클래스 이름의 철자가 정확히 동일한 지 확인해야합니다. 이름이 일치하면 작동합니다.

부분 클래스가 두 개의 다른 클래스를 정의하는 경우 일반 클래스와 동일한 규칙이 적용됩니다. 다른 클래스의 metod를 참조하려면 메서드가 공용이어야하며 해당 클래스의 인스턴스에 대한 참조가 필요하거나 메서드가 정적이어야합니다.

-------------------

물론 당신은 할 수. 클래스의 다른 모든 메서드와 마찬가지로 (부분적이든 아니든) ClassName.MethodName ()에 의해 정적 메서드를 호출하거나 클래스의 인스턴스를 만들 때 정적 메서드를 호출하고 instanceName.MethodName ()을 호출합니다.

편집 : 처음에는 귀하의 예를 보지 못해 죄송합니다.

작동합니다. 부분 클래스는 파일로 분할되지만 하나의 클래스로 컴파일됩니다. 따라서 동일한 partial 클래스의 두 번째 부분은 문제없이 다른 부분에 정의 된 private 멤버에 액세스 할 수 있습니다.

-------------------

괜찮습니다. 원하는 경우 부분적인 방법을 사용하여 형식화 할 수 있습니다. 한 파일에서 부분 스텁을 선언하고 다른 파일에서 구현합니다. 이렇게하면 클래스가 두 개 또는 한 개 있는지 신속하게 식별하고 정의되지 않은 부분 메서드를 구현하려는 시도를 강조합니다.

partial class Foo
{
    partial void Bar(string someArg);
        // other code that uses Bar(s)
        }
        partial class Foo
        {
            partial void Bar(string someArg)
                {
                        Console.WriteLine(someArg);
                            }
                            }
                            

참고 partial방법이 아닌 공개해야하고, 할 수 없습니다 out또는 비 무효 반환 형식.



출처
https://stackoverflow.com/questions/2005847