2016-12-08 3 views
14

this과 중복되지 않습니다.기능이없는 특정 길이의 문자열을 직접 입력하십시오.

문자열을 최대 길이로 만들고 싶습니다. 이 길이를 넘지 않아야합니다. 20 자 길이라고합니다. 제공된 문자열이 20보다 큰 경우 첫 번째 20 개의 문자열을 가져 와서 나머지는 버립니다.

The이 질문에 대한 대답은 기능이있는 문자열을 어떻게 처리하는지 보여 주지만 기능없이 직접 수행하려고합니다. 문자열이 기록 될 때마다 문자열 길이 검사가 수행되기를 원합니다. 다음은

는은하고 싶지 내가 할 것입니다 :

string myString = "my long string"; 
myString = capString(myString, 20); //<-- Don't want to call a function each time 

string capString(string strToCap, int strLen) 
{ 
    ... 
} 

나는 속성을 이러한 목표를 달성 할 수 있었다 :

const int Max_Length = 20; 
private string _userName; 

public string userName 
{ 
    get { return _userName; } 
    set 
    { 
     _userName = string.IsNullOrEmpty(value) ? "" : value.Substring(0, Max_Length); 
    } 
} 

가 그럼 난 쉽게 호출 whout 사용할 수 있습니다 그것을 감싸는 함수 :

userName = "Programmer"; 

이 문제는 모든 string에 대해 여러 변수가 정의되어 있어야합니다. 이 경우 _userNameuserName (속성) 변수가 있습니다.

을 수정할 때마다 함수를 호출하지 않고도 동시에 각 문자열에 대해 여러 변수를 만들지 않고 똑똑한 방식으로 수행 할 수 있습니까?

+0

아래 답변뿐만 아니라 PostSharp와 같은 AOP 프레임 워크를 사용하여 속성 설정자를 가로채는 속성을 정의 할 수 있습니다. PostSharp에는 무료/특급 버전이 있습니다. –

+0

제안 해 주셔서 감사합니다. Unity3D와 Mono를 사용하고 있으며 바이너리 크기를 늘리거나 모바일 장치에서 문제를 일으킬 수있는 타사 라이브러리 사용을 막으려 고합니다. – Programmer

+0

작동 여부는 알 수 없지만 Unity는 ['StringLengthAttribute'] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattribute (v = vs.110))를 존중합니다.aspx) .NET에 내장 된? –

답변

14

재미있는 상황 - 나는 struct을 만든 다음 this Stack Overflow question에서 수행 한 것과 유사한 그것을위한 implicit conversion operator을 정의하고 건의 할 것입니다.

public struct CappedString 
{ 
    int Max_Length; 
    string val; 

    public CappedString(string str, int maxLength = 20) 
    { 
     Max_Length = maxLength; 
     val = (string.IsNullOrEmpty(str)) ? "" : 
       (str.Length <= Max_Length) ? str : str.Substring(0, Max_Length); 
    } 

    // From string to CappedString 
    public static implicit operator CappedString(string str) 
    { 
     return new CappedString(str); 
    } 

    // From CappedString to string 
    public static implicit operator string(CappedString str) 
    { 
     return str.val; 
    } 

    // To making using Debug.Log() more convenient 
    public override string ToString() 
    { 
     return val; 
    } 

    // Then overload the rest of your operators for other common string operations 
} 

나중에 당신과 같이 사용할 수 있습니다 :

// Implicitly convert string to CappedString 
CappedString cappedString = "newString"; 

// Implicitly convert CappedString to string 
string normalString = cappedString; 

// Initialize with non-default max length 
CappedString cappedString30 = new CappedString("newString", 30); 

참고 :이 불행히도 완벽한 솔루션입니다 - 암시 적 변환이 기존 값을 전송하는 방법을 제공하지 않기 때문에 새로운 인스턴스 인 경우 기본값이 아닌 길이 값으로 초기화 된 CappedString은 생성자를 사용하여 할당해야하거나 길이 제한이 기본값으로 되돌려집니다.

+0

+1. 나는 내 대답보다이게 낫다. (나는's = "string"을 갖는 방법을 찾고 있었지만 연산자를 정의하는 것을 생각하지 않았다.) 잘 했어! – ispiro

+0

연산자 오버로드 + 구조체에서도 최고입니다. – Programmer

+0

방금 ​​해봤습니다. 나는 ArgumentOutOfRangeException : startIndex + length> this.length'를 얻는다. 예외. 나는 당신이 그것을 시도하고 자신을 위해 봐야한다고 생각한다. – Programmer

6

string 속성으로 클래스를 만들고 그 코드를 모두 넣으십시오. 그런 다음 s.Value을 필요한 특성을 가진 문자열로 사용할 수 있습니다. 같은

뭔가 :

class Superstring 
{ 
    int max_Length = 20; 
    string theString; 

    public Superstring() { } 
    public Superstring(int maxLength) { max_Length = maxLength; } 
    public Superstring(string initialValue) { Value = initialValue; } 
    public Superstring(int maxLength, string initialValue) { max_Length = maxLength; Value = initialValue; } 

    public string Value { get { return theString; } set { theString = string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(max_Length, value.Length)); } } 
} 

사용 :

Superstring s = new Superstring("z"); 
s.Value = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; 
string s2 = s.Value; 
+0

기본 문자열을 보유하는 다른 클래스 인스턴스를 작성하지 않으려 고합니다. 이는 여러 단계로 이루어지며 내 질문에있는 코드보다 많은 메모리를 사용하게됩니다. 다른 방법이 있는지 기다릴 것입니다. – Programmer

관련 문제