似乎我在处理树状视图的方法调用中的参数总是作为按引用调用完成的。
我在顶层窗口上有一个可见的GTK“树视图”控件。数据是由相应的模型编写的。
现在,我要删除一些列(基于用户设置的选项),并将操纵的树形视图传递给导出功能。
为了只从输出中删除列,而不是从GUI本身中删除列,我想到了将可见的Tree View控件复制到临时控件中,操纵临时控件并在临时控件上调用导出功能。 / p>
我的问题是:即使我将原点(可见的树视图)作为按值引用(据我的理解),也将操纵原点,并且将在可视树视图上删除列。
似乎我的方法调用中的参数总是按引用调用完成。
代码:
“ treeview1”是可视的Gtk.Tree视图...
我调用导出功能:
...
TreeView treeviewExport = SetExportViewAccordingToCheckboxes(treeview1);
ExportFile(treeviewExport);
...
在方法SetExportViewAccordingToCheckboxes()中,我只是将全局treeview1作为按值传递,在内部对其进行操作并返回经操纵的Tree View:
protected static TreeView SetExportViewAccordingToCheckboxes(TreeView tvSource)
{
TreeView tvRet = tvSource;
if (cbName == false)
tvRet.RemoveColumn( ... );
...
return tvRet;
}
但是,即使我已从内部树视图“ tvRet”中删除了列,但可视控件“ treeview1”仍缺少从“ tvRet”中删除的所有列;看起来“ treeview1”已作为按引用传递。
问题:那是为什么?
注意:我也尝试使用关键字“ in”,这没有什么区别:
protected static TreeView SetExportViewAccordingToCheckboxes(in TreeView p_tvSource)
答案 0 :(得分:0)
问题来了:
在方法SetExportViewAccordingToCheckboxes()中,我只是通过了 全局treeview1作为按值调用,在内部进行操作并返回 操纵树视图:
protected static TreeView SetExportViewAccordingToCheckboxes(TreeView tvSource) { TreeView tvRet = tvSource; if (cbName == false) tvRet.RemoveColumn( ... ); ... return tvRet; }
首先了解一些背景。在C#术语中,value types是直接包含值的变量,而reference types是引用数据而不是直接保存数据的变量。
因此,int x = 5
意味着您正在创建整数类型的值对象5,并将其存储在x
中,而TreeView tree = new TreeView()
意味着您正在创建引用{{1} },类型为 TreeView ,它指向相同类型的对象。
所有这些都意味着,即使您愿意,也无法按值传递对象。最好的情况是,您要按值传递引用,这无效。
因此,下一步是复制数据,并修改复制的对象而不是原始对象。从理论上讲这是合理的,但是不幸的是,tree
行并没有实现这一点。是的,您正在创建一个新引用,但是该引用指向原始引用所指向的同一对象。
现在,假设我们正在管理具有属性 x 和 y Point 类而不是 TreeView 的对象>。
TreeView tvRet = tvSource;
您可以轻松创建一个点:
class Point {
public int X { get; set; }
public int Y { get; set; }
}
但这不会复制它:
Point p1 = new Point { X = 5, Y = 7 };
这可以做到:
Point p2 = p1;
现在,最初的问题是您想将几列传递给 Export()函数。在这种情况下,您只需要将过滤后的列的向量传递给导出函数,而不是 TreeView 的副本。
Point p2 = new Point { X = p1.X, Y = p1.Y };
我认为这样会更容易,因为不需要尝试实现引用传递(不可能),也不需要复制树视图。
希望这会有所帮助。