2012-04-14 29 views
0

我想知道如何在c#中实现MyString类并重载运算符<<>>。 例如:自定义字符串实现超载运算符<< and >>在c#中字符串字符的二进制移位

MyString name = "string"; 

Console.Write(name<<3) // It will print **ingstr** by shifting last 3 to left 

我目前的实现如下:

public sealed class MyString 
{ 
    private readonly string _value=""; 

    public MyString(string str) 
    { 
     _value = str; 
    } 

    public override string ToString() 
    { 
     return _value; 
    } 

    public static implicit operator MyString(string str) 
    { 
     var myString = new MyString(str); 
     return myString; 
    } 

    public static explicit operator string(MyString myString) 
    { 
     return myString._value; 
    } 

    public override bool Equals(Object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     var s = obj as MyString; 
     if ((object)s == null) 
      return false; 

     return _value.Equals(obj); 
    } 

    public bool Equals(MyString str) 
    { 
     return _value.Equals(str); 
    } 

    public override int GetHashCode() 
    { 
     return _value.GetHashCode(); 
    } 

    public static bool operator ==(MyString a, MyString b) 
    { 
     return a._value.Equals(b.ToString()); 
    } 

    public static bool operator !=(MyString a, MyString b) 
    { 
     return !(a == b); 
    } 

    public static MyString operator <<(MyString s, int shift) 
    { 
     if (shift <= 0) 
     { 
      return s; 
     } 

     shift = shift % s._value.Length; 
     return s._value.Substring(shift, s._value.Length - shift) 
      + s._value.Substring(0, shift); 
    } 

    public static MyString operator >>(MyString s, int shift) 
    { 
     if (shift <= 0) 
      return s; 
     shift = shift%s._value.Length; 

     return s._value.Substring(shift, s._value.Length - shift) +    s._value.Substring(0,shift); 
    } 
} 

}

+3

首先,我劝你不要这样做 - 但你试过吗?你有多远?你遇到了什么问题? – 2012-04-14 08:41:29

+0

不要把它放在评论中 - 编辑你的*问题*。请阅读http://tinyurl.com/so-hints – 2012-04-14 08:43:14

+0

所以你现在已经展示了你的实现 - 试图实现shift操作符时出了什么问题?你清楚知道如何为'=='和'!='来重载操作符(虽然你有没有重写Equals和GetHashCode有点奇怪),那么'<<'出了什么问题? – 2012-04-14 08:48:20

回答

3

如果我真的需要它,我会写沿着线的东西:

public static string operator << (MyString s, int shift) 
{ 
    if(shift <= 0) 
    { 
     return s; 
    } 

    shift = shift % s.Length; 
    return s.String.Substring(shift, s.Length - shift) 
     + s.String.Substring(0, shift); 
} 

虽然,目前还不清楚你为什么要实施这种转变作为一个运营商你自己的班级。如何在字符串本身上定义一个extension method?那么你将能够做到这样的事情:

string str = "name".ShiftLeft(2); 
+1

我建议做转移%s.Length而不是投掷IAE。 – SimpleVar 2012-04-14 08:54:47

+0

也会检查零,以返回原始字符串。 – SimpleVar 2012-04-14 08:56:20

+0

@YoryeNathan谢谢,更改了代码。 – 2012-04-14 08:57:00

相关问题