Установка свойства класса во время выполнения в c # дает сбой Visual Studio - PullRequest
0 голосов
/ 20 декабря 2011

Работая над большим проектом wp7, я постоянно сталкивался с этой проблемой:

Каждый раз, когда я устанавливаю свойство в своем коде, происходит сбой Visual Studio 2010. Поэтому я решил провести надлежащий тест, чтобы попробоватьчтобы изолировать проблему.Следующий код представляет собой короткий пример приложения wp7, у которого та же проблема возникает аналогичным образом.Всякий раз, когда код пытается установить свойство name, происходит сбой Visual Studio.

Примечания. У меня не установлены надстройки, и при попытке запустить его в безопасном режиме я получаю сообщение об ошибке «Тип проектане поддерживается этой установкой "

Любая помощь будет оценена

using System;
using System.Collections.Generic;
using System.Windows;
using Microsoft.Phone.Controls;

namespace propertytest
{
    public partial class MainPage : PhoneApplicationPage
    {
        public string name
        {
            get { return name; }
            set
            {
                //crash!
                if (value != name)
                {
                    name = value;
                    hi(name); 
                }
            }
        }
        void hi(string name)
        {
            MessageBox.Show("hi "+name);
        }
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            // Set the data context of the listbox control to the sample data
            DataContext = App.ViewModel;
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
            name = "your name";
        }

        // Load data for the ViewModel Items
        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            if (!App.ViewModel.IsDataLoaded)
            {
                App.ViewModel.LoadData();
            }
        }
    }
}

Стек вызовов:

propertytest.dll!propertytest.MainPage.name.set(string value) Line 14   C#
propertytest.dll!propertytest.MainPage.MainPage() Line 34 + 0xb bytes   C#
     mscorlib.dll!System.Reflection.RuntimeConstructorInfo.InternalInvoke(System.Reflection.RuntimeConstructorInfo rtci, System.Reflection.BindingFlags invokeAttr,     System.Reflection.Binder binder, object parameters, System.Globalization.CultureInfo culture, bool isBinderDefault, System.Reflection.Assembly caller, bool verifyAccess, ref     System.Threading.StackCrawlMark stackMark)    
mscorlib.dll!System.Reflection.RuntimeConstructorInfo.InternalInvoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture, ref System.Threading.StackCrawlMark stackMark) + 0x114 bytes    
mscorlib.dll!System.Activator.InternalCreateInstance(System.Type type, bool nonPublic, ref System.Threading.StackCrawlMark stackMark) + 0xf0 bytes  
mscorlib.dll!System.Activator.CreateInstance(System.Type type) + 0x2 bytes  
Microsoft.Phone.dll!System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(System.AsyncCallback userCallback, System.Windows.Navigation.PageResourceContentLoader.PageResourceContentLoaderAsyncResult result) + 0xe6 bytes   
Microsoft.Phone.dll!System.Windows.Navigation.PageResourceContentLoader.BeginLoad.AnonymousMethod__0(object args) + 0x11 bytes  
mscorlib.dll!System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo rtmi, object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object parameters, System.Globalization.CultureInfo culture, bool isBinderDefault, System.Reflection.Assembly caller, bool verifyAccess, ref System.Threading.StackCrawlMark stackMark)   
mscorlib.dll!System.Reflection.RuntimeMethodInfo.InternalInvoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture, ref System.Threading.StackCrawlMark stackMark) + 0x168 bytes 
mscorlib.dll!System.Reflection.MethodBase.Invoke(object obj, object[] parameters) + 0xa bytes   
mscorlib.dll!System.Delegate.DynamicInvokeOne(object[] args) + 0x98 bytes   
mscorlib.dll!System.MulticastDelegate.DynamicInvokeImpl(object[] args) + 0x8 bytes  
mscorlib.dll!System.Delegate.DynamicInvoke(object[] args) + 0x2 bytes   
System.Windows.dll!System.Windows.Threading.DispatcherOperation.Invoke() + 0xc bytes    
System.Windows.dll!System.Windows.Threading.Dispatcher.Dispatch(System.Windows.Threading.DispatcherPriority priority) + 0x83 bytes  
System.Windows.dll!System.Windows.Threading.Dispatcher.OnInvoke(object context) + 0x8 bytes 
System.Windows.dll!System.Windows.Hosting.CallbackCookie.Invoke(object[] args) + 0x19 bytes 
System.Windows.dll!System.Windows.Hosting.DelegateWrapper.InternalInvoke(object[] args) + 0x2 bytes 
System.Windows.RuntimeHost.dll!System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(System.IntPtr pHandle, int nParamCount, System.Windows.Hosting.NativeMethods.ScriptParam[] pParams, ref System.Windows.Hosting.NativeMethods.ScriptParam pResult) + 0x5e bytes 
[External Code] 



**Debug Output:**
'UI Task' (Managed): Loaded 'mscorlib.dll'
'UI Task' (Managed): Loaded 'System.Windows.RuntimeHost.dll'
'UI Task' (Managed): Loaded 'System.dll'
'UI Task' (Managed): Loaded 'System.Windows.dll'
'UI Task' (Managed): Loaded 'System.Net.dll'
'UI Task' (Managed): Loaded 'System.Core.dll'
'UI Task' (Managed): Loaded 'System.Xml.dll'
'UI Task' (Managed): Loaded '\Applications\Install\1782A5A4-3D00-47D3-A109-B889805E61F9\Install\propertytest.dll', Symbols loaded.
'UI Task' (Managed): Loaded 'Microsoft.Phone.dll'
'UI Task' (Managed): Loaded 'Microsoft.Phone.Interop.dll'
'UI Task' (Managed): Loaded '\Applications\Install\1782A5A4-3D00-47D3-A109-B889805E61F9\Install\Microsoft.Phone.Controls.dll'

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

Вы вызываете установщик рекурсивно:

        set
        {
            if (value != name)
            {
                name = value; // <-- Argh! Recursion!
                hi(name); 
            }
        }

Если вы хотите реализовать метод получения / установки таким образом, вам нужно будет использовать закрытую переменную-член:

       private string _name;
       public string name
       {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    hi(_name); 
                }
            }
        }
2 голосов
/ 20 декабря 2011

У вас бесконечный рекурсивный цикл

Этот бит

if (value != name) звонит получателю имущества

например. этот бит

get { return name; }, который, в свою очередь, вызывает себя, пока вы не разнесете стек.

Вам нужно использовать поле поддержки для хранения значения в поле поддержки;

private string _name

 public string name
        {
            get { return _name; }
            set
            {
                // won't crash any more
                if (value != _name)
                {
                    _name = value;
                    hi(name); 
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...