如何操纵位阵列

塞缪尔

新成员
加入
2019年4月14日
消息
3
编程经验
Beginner
这是我在这里的第一篇文章。我想学习C#,没有开发经验。我在下面找到了代码,不能遵循我标记的部分中发生的事情。
位阵列的索引者的实施:
class BitArray
{
    int[] bits;
    int length;

    public BitArray(int length) {
        if (length < 0) throw new ArgumentException();
        bits = new int[((length - 1) >> 5) + 1];
        this.length = length;
    }

    public int Length {
        get { return length; }
    }

    public bool this[int index] {
        get {
            if (index < 0 || index >= length) {
                throw new IndexOutOfRangeException();
            }//What is happening in the line below?
            return (bits[index >> 5] & 1 << index) != 0;
        }
        set {
            if (index < 0 || index >= length) {
                throw new IndexOutOfRangeException();
            }// Also in the if statement below I do not see what is going on
            if (value) {
                bits[index >> 5] |= 1 << index;
            }// Same here in the else block, what is happening?
            else {
                bits[index >> 5] &= ~(1 << index);
            }
        }
    }
}
我得到了代码 这里.
 

塞缪尔

新成员
加入
2019年4月14日
消息
3
编程经验
Beginner
为什么你甚至首先看那个代码?你实际上想要实现什么?
我是通过杰夫富豪的CLR预订阅读C#。在第622页,他有以下代码:
C#:
[Serializable]
public class Dictionary<TKey, TValue>: ISerializable, IDeserializationCallback {
// Private fields go here (not shown)
private SerializationInfo m_siInfo; // Only used for deserialization
// Special constructor (required by ISerializable) to control deserialization
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
protected Dictionary(SerializationInfo info, StreamingContext context) {
// During deserialization, save the SerializationInfo for OnDeserialization
m_siInfo = info;
}
// Method to control serialization
[SecurityCritical]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("Version", m_version);
info.AddValue("Comparer", m_comparer, typeof(IEqualityComparer<TKey>));
info.AddValue("HashSize", (m_ buckets == null) ? 0 : m_buckets.Length);
if (m_buckets != null) {
KeyValuePair<TKey, TValue>[] array = new KeyValuePair<TKey, TValue>[Count];
CopyTo(array, 0);
info.AddValue("KeyValuePairs", array, typeof(KeyValuePair<TKey, TValue>[]));
}
}
// Method called after all key/value objects have been deserialized
public virtual void IDeserializationCallback.OnDeserialization(Object sender) {
if (m_siInfo == null) return; // Never set, return
Int32 num = m_siInfo.GetInt32("Version");
Int32 num2 = m_siInfo.GetInt32("HashSize");
m_comparer = (IEqualityComparer<TKey>)
m_siInfo.GetValue("Comparer", typeof(IEqualityComparer<TKey>));
if (num2 != 0) {
m_buckets = new Int32[num2];
for (Int32 i = 0; i < m_buckets.Length; i++) m_buckets[i] = -1;
m_entries = new Entry<TKey, TValue>[num2];
m_freeList = -1;
KeyValuePair<TKey, TValue>[] pairArray = (KeyValuePair<TKey, TValue>[])
m_siInfo.GetValue("KeyValuePairs", typeof(KeyValuePair<TKey, TValue>[]));
if (pairArray == null)
ThrowHelper.ThrowSerializationException(
ExceptionResource.Serialization_MissingKeys);
for (Int32 j = 0; j < pairArray.Length; j++) {
if (pairArray[j].Key == null)
ThrowHelper.ThrowSerializationException(
ExceptionResource.Serialization_NullKey);
Insert(pairArray[j].Key, pairArray[j].Value, true);
}
} else { m_buckets = null; }
m_version = num;
m_siInfo = null;
}
虽然我得到了他试图制作的那一点,但我不能遵循每一行的事情。所以我开始查找我没有得到的部分。第一个是字典<TKey, TValue>,我无法遵循索引者如何工作,所以我查找了索引器规范,它给了位阵列中使用的索引器的示例,我认为这就是我如何找到语言参考的方式。如果我很好地了解索引者,我想我会全部设置。我只需要一个解释,不涉及我猜的左侧或正确的操作。例如,他们使用下面的代码"this"关键字引用索引器,我从未见过"[]"s以前用于成员字段。
C#:
using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get { return arr[i]; }
      set { arr[i] = value; }
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection[0] = "Hello, World";
      Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.
我要说通过语言规范的阅读帮助我有一些我知道C#类的差距。例如,我没有理解属性,以及访问者如何工作,但我现在感觉好多了。为什么这对像我这样的人来说这不是一个很好的阅读?你能详细说明吗?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
为什么这对像我这样的人来说这不是一个很好的阅读?
我没有说它不是。你似乎假设我的问题有一些邪恶的意图。没有。这是一个旨在引出信息,这些问题可以帮助我更好地回答你的问题。事实证明,这是一个好主意,因为你似乎问的问题不是你想要的问题。如果您想了解索引者,那么询问索引者可能是一个好主意。

无论如何,C#类中的索引器基本上是一个特殊属性,允许您按索引访问类中的数据。括号表示法是如何在C#中指定索引。如果你已经使用过阵列,那么你会熟悉这一点,例如,
C#:
// Create a new array with 12 elements.
var squares = new int[12] {};

// Set each element.
for (var i = 0; i < numbers.Length; i++)
{
    squares[i] = i * i;
}

// Display each element.
for (var i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(squares[i]);
}
Just as you index an array using brackets, so you index a class with an indexer using brackets. The SampleCollection class in your last code snippet could be used in virtually the same way.

The indexer itself is pretty much like a regular property, with a getter and setter. It is always named though, and it can have one or more parameters, just like a method. As you noticed though, those parameters are specified within brackets rather than parentheses though. More often than not, an index would be a sequential numeric value, as for an array. They could be something else though, e.g. an arbitrary string key or other object, as for a Dictionary. A Dictionary is something like an array in that it contains multiple values, but those values are identified by their relationship to unique key values rather than a sequential numerical order.
 

塞缪尔

新成员
加入
2019年4月14日
消息
3
编程经验
Beginner
非常感谢。你是对的,我在没有意识到我这样做的情况下。感谢您的澄清,非常感谢您花时间解释主题。如您所知,一些论坛对人们的要求以及格式以及他们是否研究主题有点严格。这帮助我意识到我应该更耐心,并在不假设的情况下提供所要求的细节。非常感谢您的回复。
 
最佳 底部