当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能在c#中定义一下?

如何解决《为什么我不能在c#中定义一下?》经验,为你挑选了4个好方法。

为什么C#中没有一点结构?



1> Konamiman..:

值得一提的是,这里有一个完整的位结构,完整的intbool铸造和算术运算.可能不完美,但对我来说效果很好.请享用!

/// 
/// Represents a single bit that can be implicitly cast to/from and compared
/// with booleans and integers.
/// 
/// 
/// 
/// An instance with a value of one is equal to any non-zero integer and is true,
/// an instance with a value of zero is equal to the integer zero and is false.
/// 
/// 
/// Arithmetic and logical AND, OR and NOT, as well as arithmetic XOR, are supported.
/// 
/// 
public struct Bit
{
    /// 
    /// Creates a new instance with the specified value.
    /// 
    /// 
    public Bit(int value) : this()
    {
        Value = value == 0 ? 0 : 1;
    }

    /// 
    /// Gets the value of the bit, 0 or 1.
    /// 
    public int Value { get; private set; }

    #region Implicit conversions

    public static implicit operator Bit(int value)
    {
        return new Bit(value);
    }

    public static implicit operator int(Bit value)
    {
        return value.Value;
    }

    public static implicit operator bool(Bit value)
    {
        return value.Value == 1;
    }

    public static implicit operator Bit(bool value)
    {
        return new Bit(value ? 1 : 0);
    }

    #endregion

    #region Arithmetic operators

    public static Bit operator |(Bit value1, Bit value2)
    {
        return value1.Value | value2.Value;
    }

    public static Bit operator &(Bit value1, Bit value2)
    {
        return value1.Value & value2.Value;
    }

    public static Bit operator ^(Bit value1, Bit value2)
    {
        return value1.Value ^ value2.Value;
    }

    public static Bit operator ~(Bit value)
    {
        return new Bit(value.Value ^ 1);
    }

    public static Bit operator !(Bit value)
    {
        return ~value;
    }

    #endregion

    #region The true and false operators

    public static bool operator true(Bit value)
    {
        return value.Value == 1;
    }

    public static bool operator false(Bit value)
    {
        return value.Value == 0;
    }

    #endregion

    #region Comparison operators

    public static bool operator ==(Bit bitValue, int intValue)
    {
        return 
          (bitValue.Value == 0 && intValue == 0) || 
          (bitValue.Value == 1 && intValue != 0);
    }

    public static bool operator !=(Bit bitValue, int intValue)
    {
        return !(bitValue == intValue);
    }

    public override bool Equals(object obj)
    {
        if(obj is int)
            return this == (int)obj;
        else
            return base.Equals(obj);
    }

    #endregion
}


这不使用1bit的内存,它使用4个字节,因为你所做的只是围绕一个int.
我从来没有声称这个_use_ 1位内存.它只是_代表_ 1位.我仍然不理解downvotes.

2> Ed S...:

它被称为布尔值.至少,它会起到基本作用,对吧?你不会在C#中捏碎比特(至少,我没有),如果你需要,你可以使用内置的操作.


布尔通常不是一点点.

3> VVS..:

这里一个BitArray类..



4> Jon Skeet..:

你想用它做什么?请记住,CLR不会尝试将多个变量打包到一个字节中,因此单独使用一个变量并不比布尔值更有用.如果你想拥有它们的集合 - 嗯,正如大卫指出的那样,这就是BitArray的用途.

如果我们确实有Bit结构,我怀疑人们会期望在内存中有效地打包多个Bit变量 - 由于首先没有类型,我们避免了这种期望并引导人们采用其他解决方案,如BitArray.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有