关于C#引用类型的疑问

生 先 0 信誉分
2024-09-08T14:38:36.69+00:00

        public panelS GetPanelS(Grid panelGrid)
        {
            //Grid panelGrid = _lbls.Parent as Grid;
            Canvas pageGrid = panelGrid.Parent as Canvas;
            ScrollViewer scrollViewer = pageGrid.Parent as ScrollViewer;
            TabItem tabItem = scrollViewer.Parent as TabItem;
            foreach (myTabPages _myTabPage2 in InvokeWindow._myTabPages)
            {
                if (_myTabPage2._tabPageName == tabItem.Name)
                {
                    foreach (panelS panelS2 in _myTabPage2._panelS)
                        if (panelS2.panelName == panelGrid.Name)
                        {
                            return panelS2;
                        }
                }
            }
            return null;
        }
        public myTabPages GetmyTabPages(string tabPageName)
        {
            foreach (myTabPages _myTabPages3 in InvokeWindow._myTabPages)
                if (_myTabPages3._tabPageName == tabPageName)
                    return _myTabPages3;
            return null;
        }
当以上代码与下面代码在同一个类里时,执行正常。

                    myTabPages myTabPage = GetmyTabPages(tabItem1.Name);
                    panelS panelS1 = GetPanelS(finalPressedgrid);
                    myTabPage._panelS.Remove(panelS1);//删除重复
                    myTabPage._panelS.Insert(dragOverGridIndex, panelS1);//插入数组
当上面两个方法在GetArrayControl类里时,

                    GetArrayControl getArrayControl1 = new GetArrayControl();
                    myTabPages myTabPage = getArrayControl1.GetmyTabPages(tabItem1.Name);
                    panelS panelS1 = getArrayControl1.GetPanelS(finalPressedgrid);
                    myTabPage._panelS.Remove(panelS1);//删除重复
                    myTabPage._panelS.Insert(dragOverGridIndex, panelS1);//插入数组
执行不正常,代码修改了myTabPage ,并没有修改InvokeWindow._myTabPages中的内容。
为什么?

C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
188 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Jiale Xue - MSFT 46,466 信誉分 Microsoft 供应商
    2024-09-09T09:44:49.86+00:00

    当你在GetArrayControl类中调用GetmyTabPagesGetPanelS方法时,返回的对象可能是myTabPagespanelS的副本或引用错误,而不是对InvokeWindow._myTabPages中对象的直接引用。

    在 C# 中,如果你直接访问一个类的字段(如InvokeWindow._myTabPages),你会得到该对象的引用。但如果你通过某种方式创建了新的对象或传递了副本(例如通过值类型复制或者错误的引用路径),你将不会影响原来的集合。

    你可以先检查InvokeWindow._myTabPages是否为静态(static):public static List<myTabPages> _myTabPages;

    如果InvokeWindow._myTabPages不是静态的,确保在GetArrayControl类中持有对同一个InvokeWindow对象的引用。例如:

    public class GetArrayControl
    {
        private InvokeWindow _invokeWindow;
        public GetArrayControl(InvokeWindow invokeWindow)
        {
            _invokeWindow = invokeWindow;
        }
    
     public panelS GetPanelS(Grid panelGrid)
            {
                //Grid panelGrid = _lbls.Parent as Grid;
                Canvas pageGrid = panelGrid.Parent as Canvas;
                ScrollViewer scrollViewer = pageGrid.Parent as ScrollViewer;
                TabItem tabItem = scrollViewer.Parent as TabItem;
                foreach (myTabPages _myTabPage2 in InvokeWindow._myTabPages)
                {
                    if (_myTabPage2._tabPageName == tabItem.Name)
                    {
                        foreach (panelS panelS2 in _myTabPage2._panelS)
                            if (panelS2.panelName == panelGrid.Name)
                            {
                                return panelS2;
                            }
                    }
                }
                return null;
            }
    
        public myTabPages GetmyTabPages(string tabPageName)
        {
            foreach (myTabPages _myTabPages3 in _invokeWindow._myTabPages)
                if (_myTabPages3._tabPageName == tabPageName)
                    return _myTabPages3;
            return null;
        }
    }
    GetArrayControl getArrayControl1 = new GetArrayControl(invokeWindowInstance);
    myTabPages myTabPage = getArrayControl1.GetmyTabPages(tabItem1.Name);
    panelS panelS1 = getArrayControl1.GetPanelS(finalPressedgrid);
    myTabPage._panelS.Remove(panelS1);//删除重复
    myTabPage._panelS.Insert(dragOverGridIndex, panelS1);//插入数组
    
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。