2011-10-24 5 views
-2

모두이 클래스 생성자에 struct을 전달하는 데 어려움이 있습니다. 나는 기존 코드의 일부를 멀티 스레딩하는 과정에있다. 한 클래스의 다음 구조가 정의된다구조체의 배열을 C#의 클래스에 전달하는 방법

SchemaFileRec[] m_TableList; 

struct SchemaFileRec 
{ 
    public ArrayList saFile; 
    public ArrayList saImpTab; 
    public ArrayList saSheet; 
    // And others... 
    public int[]  nColHead; 
    public int[]  nSkipBeg; 
    public int[]  nSkipEnd; 
    public string  strADTFld; 
}; 

이 방법에 사용되는 몇 가지 처리를 수행하도록 (구 ExecCmd 방법이라고 함). 나는이 방법을 수업에 다시 쓰고있다. 실제로 하위 클래스는 BackgroundWorker입니다. 근본적으로 나는 "장기 실행"작업을 다루는 방법을 사용하고 있으며,이를 여러 번 발생시킨다.

public class ExecCmdsThredded : BackgroundWorker 
{ 
    // Global variables and constants. 
    private int nTable; 
    private List<int> kPrmArray = null; 
    private List<object> StructureArray = null; 
    private SpreadsheetGear.IWorksheet worksheet; 

    // Default constructor to handle thred properties. 
    public ExecCmdsThredded() 
    { 
     WorkerReportsProgress = true; 
     WorkerSupportsCancellation = true; 
    } 

    // Constructor to parse relevant parameters to worker. 
    // Or as an array of objects public ExecCmdsThredded(object[] _StructArr, etc. 
    public ExecCmdsThredded(List<object> _StructArr, List<int> _kPrmArr, ArrayList[] _saCmd, 
          int _nTable, SpreadsheetGear.IWorksheet _worksheet) : this() 
    { 
     this.nTable = _nTable; 
     this.kPrmArray = _kPrmArr; 
     this.StructureArray = _StructArr; 
     this.worksheet = _worksheet; 
    } 
    // ... 

내가 지금 생성자를 통해 ExecCmdsThredded 클래스에 위에서 구조를 전달하려는하지만 내가 전에이 작업을 수행 할 수 없었으며 그것이 내가 그것을 원하는 방식으로 가능하면 나는 확실하지 않다 : 내가 가진 ? 나는 분명히 struct의 모든 구성 요소를 통과시킬 수 있지만 이것을 피하고 싶습니다.

감사합니다.

+0

"구문 분석"대신 "전달"을 의미합니다. public ExecCmdsThredded (SchemaFileRec [] schemaFileRecs)와 같은 클래스 생성자에 구조체 배열을 전달하는 방법을 묻고 있습니까? –

+0

나는 사과를 건네는 것을 의미한다 (좋은 날은 아니었다). 예, 제가하고 싶은 것입니다. 하지만 클래스에 전달되는 내용이 변경 될 수 있으므로 여러 가지 'structs'를 하나의 객체 배열로 전달하고자하므로 생성자의 일반 컨테이너 여야합니다. – MoonKnight

+2

당신은 항상 객체'object []'의 배열을 전달할 수 있으며 box 내부에 어떤 유형의 구조체 나 클래스도 가질 수 있습니다. boxing/unboxing 부작용으로 인해 알려지지 않습니다. 무슨 뜻인지 예 :'new ExecCmdsThredded (new object [] {new SchemaFileRec (new, AnotherSchema()}));'하지만 구조체를 없애고 대신 Generics를 사용할 수 있도록 클래스를 생성하여 코드를 읽기 쉽게 만듭니다. 적어도. –

답변

1

구조체를 전달하기 시작할 때마다 불편 함을 느낍니다. 매개 변수로 전달하려는 구조체 컬렉션을 가지고 있으면 조심스럽게 디자인을 다시 방문하십시오. "구조체를 사용하는 이유는 무엇입니까?" 구조체를 클래스로 변환하는 것이 좋습니다 대부분 경우입니다.

구조체 또는 클래스 중 어느 것을 사용할지 결정하는 데 도움이되는 몇 가지 링크가 있습니다. StackOverflowMSDN

+0

그건 도움이됩니다. 나는 C#, 실제로 상업적인 프로그래밍에 비교적 익숙하지 않다. 나는이 오래된 복잡하고 (논평되지 않은) 코드를 받았으며 너무 깊숙해지는 것을 피하려고한다. 그러나이 점은 두 번이나되어 당신의 충고에 유의할 것입니다. 시간 내 주셔서 감사합니다. – MoonKnight

+0

@Killercam : 구조 및 클래스에 유용한 리소스 링크를 추가하는 편집 내역을 참조하십시오. – IAbstract

+0

시간 내 주셔서 대단히 감사합니다. – MoonKnight

2

당신은 항상 객체 객체 배열을 전달할 수 있습니다. [] 안에 box/unboxing 부작용 때문에 어떤 유형의 구조체 나 클래스도 상자에 넣을 수 있습니다. 무슨 뜻인지의 예 :

new ExecCmdsThredded(new object[] { new SchemaFileRec(), new AnotherSchema() });

하지만 대신 Generics을 사용할 수 있도록 구조체이 클래스를 생성 떨어지는 것이 좋습니다 적어도 코드를 읽기 수 있습니다.

관련 문제