我似乎记得读过一些关于结构通过C#在CLR中实现接口有什么不好的东西,但我似乎无法找到任何关于它的东西.这不好吗?这样做会产生意想不到的后果吗?
public interface Foo { Bar GetBar(); }
public struct Fubar : Foo { public Bar GetBar() { return new Bar(); } }
Run Code Online (Sandbox Code Playgroud) 我有List<T>一些包含一些数据.我想把它传递给一个接受的函数ReadOnlySpan<T>.
List<T> items = GetListOfItems();
// ...
void Consume<T>(ReadOnlySpan<T> buffer)
// ...
Consume(items??);
Run Code Online (Sandbox Code Playgroud)
在这个特定的例子中,T是,byte但它并不重要.
我知道我可以.ToArray()在List上使用,并构造一个span,例如
Consume(new ReadOnlySpan<T>(items.ToArray()));
Run Code Online (Sandbox Code Playgroud)
然而,这会创建(看似)不必要的项目副本.有没有办法直接从列表中获取Span?List<T>是在T[]幕后实施的,所以从理论上来说这是可能的,但在实践中并没有我能看到的那么多?
我有一个List<Cat>地方Cat是struct有一个ID和一个名称.
如何更改ID为7的猫的名称?
我做了(没想到)
var myCat = catList.Single(c => c.Id == 7);
mycat.Name = "Dr Fluffykins";
Run Code Online (Sandbox Code Playgroud)
但当然,结构是价值类型.那么是否可以使用这样的技术,或者我是否必须更改.Single为for循环并存储索引以使用更新的结构替换它?
关于结构的简单问题...我有一个结构,让我们假装它看起来像这样:
struct myStruct {
public int x, y;
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个包含该结构的列表
List<myStruct> myList = new List<myStruct>;
Run Code Online (Sandbox Code Playgroud)
然后我循环遍历列表,我想更改 x 的值......
for(int i=0; i<myList.Count; i++) {
...//do stuff to x
myList[i].x = newX;
}
Run Code Online (Sandbox Code Playgroud)
无法修改 'List<myform.myStruct>.this[int]' 的返回值,因为它不是变量
您能否澄清我对于为什么它不允许我更改 x 值的任何困惑。
我创建了一个IList变量如下:
IList<vertex> matrix = new List<vertex> ();
Run Code Online (Sandbox Code Playgroud)
这里,顶点是我定义的一个结构,其中一个成员被访问(布尔).
但是,当我尝试通过遍历列表来修改此成员时,如下所示:
matrix[j].visited = false;
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误,说"无法修改返回值,因为它不是变量".知道为什么吗?