2014-09-12 3 views
0

그래서 저는 C#을 시도하고 있습니다. 객체가 생성 될 때 문자열을 생성자 인수로 사용하는 클래스가 필요합니다. 그런 다음 문자열이 클래스 내에 저장됩니다. 다음과 같은 것 :생성자의 문자열 복사

public class DVD 
{ 
    public string sTitle, sName, sType; 
    public int iLength=0; 

    DVD(string title, string name, string type, int length) 
    { 

     sTitle = title; 
     sName = name; 
     sType = type; 

    } 
}; 

내가 알고있는 것으로, 문자열은 단지 참조 용입니다. 내가 더 성공

sTitle = new String(title); 

sTitle = new String; 
sTitle = title; 

등의 작업을 수행하려고

Warning 2 Field 'DVDsorter.DVD.sName' is never assigned to, and will always have its default  value null 

: 나는 오류 메시지를받을 이유는 아마도 이유이다.

몇 가지 유용한 배경 정보는 텍스트 파일에서 DVD의 라인 정보를 읽은 다음 각 DVD를 위의 DVD 클래스의 개체로 저장하는 것일 수 있습니다. 즉, 정보를 딥 카피하고 싶습니다.

어떻게 해결할 수 있을까요?

+3

당신은 명시 적으로이 같은 문자열을 복사 할 필요가 거의 절대 :

var dvd = new DVD("Some Title", "Some Name", "Some Type", 1); 

당신은 컴파일 타임 오류가 발생합니다 :

는 이 입증

쉬운 방법은 코드 줄을 실행하는 것입니다 . 그리고 이것이 실제 코드라면이 오류를 보지 않아야합니다. 이것이 실제 코드라면 [솔루션 정리] (http://msdn.microsoft.com/en-us/library/5tdasz7h.aspx) –

+3

방금 ​​코드를 컴파일 했으므로 오류나 경고가 없습니다. 문제가 무엇입니까? –

+0

그런데 객체를 인스턴스화하면() 및 {} 인 이니셜 라이저 (생성자)를 사용해야합니다. 나는 '새로운 문자열'에 대해 이야기하고있다. – JustWork

답변

1

문자열은 reference types이지만 변경할 수 없습니다. 그래서, 당신이 말하는 경우 :

string s1 = "some string"; 
string s2 = s1; 

s1 = "that was easy"; 

Console.WriteLine(s1); 
Console.WriteLine(s2); 

당신은 그들이 차이가 나타납니다.

나는 설명으로 이것을 썼다. 나는 당신의 코드에 문제가 보이지 않는다. 컴파일을 시도한 이후로 업데이트 한 적이 있습니까?

는 그래도이 방법을 추천합니다 : 그것은 조금 청소기

public class DVD 
{ 
    public string Title{ get; set;} 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public int Length { get; set; } 

    public DVD(string title, string name, string type, int length) 
    { 

     Title = title; 
     Name = name; 
     Type = type; 
     Length = length; 

    } 
} 

. 오타가 없도록 컴파일하지 않았습니다.

+0

그래도 편집 작업을 마쳤습니다. 집합은 무엇입니까? 줄을 잡아라? 특히 뭔가 부르는거야? 나는 C++에서 그것을 보지 못했지만, C#에 특정한 것이 있다고 생각합니까? – user3050215

+0

예, 자동 속성입니다. C#에는 이러한 속성에 대한 개념이 있습니다. 당신은 "얻을"수 있습니다. 본문에 특별한 코드가 있습니다. C# 3.5에서는이 바로 가기가 추가되어 나중에 "인터페이스"를 변경할 필요없이 코드를 추가 할 수있는 옵션을 가진 속성을 가질 수있었습니다. – BobbyShaftoe

1

먼저 두 가지 팁을 제공합니다. 전염병과 같은 공개 필드는 피해야합니다.

private string _title; 
public string Title 
{ 
    get { return _title; } 
    set 
    { 
     if (!String.IsNullOrWhiteSpace(value) && _title != value) 
     { 
      _title = value; 
     } 
    } 
} 
: 당신은 몇 가지 검증 (여기에 기본 예제)를 구현하려는 경우 개인 백업 필드

public string Title { get; set; } 

... 또는 속성 : 당신은 필드를 노출하거나 자동 속성을 사용해야하는 경우

또한, 나는이 중 하나를 백업 필드를 통해 또는 생성자를 통해 수행 할 수 있습니다 초기 값과 속성을 초기화하는 것을 선호하고 (취향에 따라과 선택보다 당신이 함께 이동하는) :

private string _title = ""; // or String.Empty; 
public string Title 
{ 
    // same code as above 
} 

// or... 

public DVD() 
{ 
    Title = ""; // or String.Empty; 
} 

null 값보다 빈 문자열을 처리하는 편이 낫습니다. 구현 한 경우 null 체크가 어딘가에 있습니다. 이것은 단지 팁 일 뿐이므로 소금 한 알씩 가져 가십시오. 이 사람의 양쪽에 사람들이 있습니다. "None"과 같은 일반 문자열이나 그 행에있는 값을 할당 할 수도 있습니다. 그러면 값이 할당되지 않았 음을 나타냅니다.

값에 대한 문제가 생성자를 통해 필드에 할당되지 않는 한 ... 개인 생성자가 있기 때문입니다.당신은 당신의 생성자의 public 액세스 한정자를 지정해야합니다

public DVD(string title, string name, string type, int length) { ... } 

을 ... 대신 전류 :

DVD(string title, string name, string type, int length) { ... } 

은 * 처음에 public 액세스 수정을합니다.

`YourApplicationName.DVD' does not contain a constructor that takes 4 arguments 
+0

좋아요! 따라서 자동 속성은 얻을 때마다 메서드를 설정할 필요가 없다는 것을 의미합니다. 실제로 이점을 얻지 못합니다. 그 속성은 항상 존재할 수 있었고 필요할 때마다 재정의 될 수 있었습니까? 공식 예제를 찾았습니다. http://msdn.microsoft.com/en-us/library/bb384054.aspx 그러나 예제에서는 get, set 메서드를 사용하지 않습니다. 이것은 나쁜 예입니까, 아니면 자동 속성이 명확하지 않은 부분 만 활성화합니까? 어쨌든 공용 변수에 대한 쓰기가 가능하기 때문입니다. – user3050215

+0

@ user3050215 수정하십시오. 자동 속성은 getter, setter 및 backing 필드를 포함합니다 (백업 필드에서 추가 유효성 검사를 원하지 않는 경우). 발견 한 MSDN 예제는 사용 방법을 완벽하게 보여줍니다. '.Get()'또는'.Set()'... 대신에 필드/멤버와 같이 할당 할 수 있습니다. 자동 속성의 이점은 getter와 setter를 통해 들어오고 나가는 것의 유효성을 검사하고 허용 할 작업을 제한 할 수 있다는 것입니다. 예를 들어, 읽기에는 공개로 설정할 수 있지만 설정하려면 private으로 설정할 수 있습니다.'public string Title {get; 개인 집합; }' –