小编MTR*_*MTR的帖子

对象不会被垃圾收集

我认为这是一个C#初学者问题,但我似乎无法找到正确的解决方案.

我有一个ClassOne对象,它定义了一个事件.我创建了一个ClassTwo对象,它被认为是一个黑盒子,这意味着我不知道它是否会注册到任何事件.ClassTwo构造函数注册到ClassOne的事件.当ClassTwo对象超出范围时,问题就出现了.垃圾收集器永远不会删除此对象,因为它从未取消注册该事件.

所以我有两个问题:

  1. 当ClassTwo对象超出范围时,有没有办法知道?对于一个旧的C++程序员来说,这将是在析构函数中,但是使用C#这不起作用.

  2. 有没有一个调试工具可以帮助我找到这样的对象?

以下是重现问题的示例代码:

    public partial class MainWindow : Window
{
    static public ClassOne classOne = new ClassOne();
    public MainWindow()
    {
        InitializeComponent();
        ClassTwo classtwo = new ClassTwo();
    }

    private void buttonTest_Click(object sender, RoutedEventArgs e)
    {
        GC.Collect();
    }
}
public class ClassOne
{
    public ClassOne()
    {
        Trace.WriteLine(this + " constructor");
    }

    ~ClassOne()
    {
        Trace.WriteLine(this + " destructor");
    }

    public delegate void UpdateFunc(object sender, EventArgs args);
    public event UpdateFunc OnUpdate;

}
public class ClassTwo
{
    public ClassTwo()
    {
        Trace.WriteLine(this + …
Run Code Online (Sandbox Code Playgroud)

c# events garbage-collection destructor

13
推荐指数
2
解决办法
1758
查看次数

绑定到数组元素

我正在尝试将TextBlock绑定到ObservableCollection中的特定元素.这就是我现在所做的:

private ObservableCollection<double> arr = new ObservableCollection<double>();
public ObservableCollection<double> Arr { get { return arr; } set { arr = value; }  }

testBox.DataContext = this;

private void Button_Click(object sender, RoutedEventArgs e)
{
   Arr[0] += 1.0;
}

    [ValueConversion(typeof(ObservableCollection<double>), typeof(String))]
    public class myObsCollConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            ObservableCollection<double> l = value as ObservableCollection<double>;
            if( l == null )
                return DependencyProperty.UnsetValue;
            int i = int.Parse(parameter.ToString());

            return l[i].ToString();
        }

        public object ConvertBack(object value, …
Run Code Online (Sandbox Code Playgroud)

.net data-binding wpf xaml

12
推荐指数
2
解决办法
2万
查看次数

在xaml中设计datatemplate的时间数据

这可能是一个愚蠢的问题,但是可以将一些示例数据定义为DataContext,以便在DesignView中查看我的DataTemplate吗?

目前,我总是要运行我的应用程序,看看我的更改是否正常.

例如,使用以下代码,DesignView只显示一个空列表框:

 <ListBox x:Name="standardLayoutListBox" ItemsSource="{Binding myListboxItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Label Grid.Column="0" Content="{Binding text1}" />
                <Label Grid.Column="1" Content="{Binding text2}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

wpf xaml datatemplate designview

12
推荐指数
1
解决办法
1万
查看次数

WIX中的guids语法?

为WIX的wxs文件中的组件提供guid的正确语法是什么?

在我找到的大多数样品中

Guid="00AD2D6E-BF8A-4EA8-BE9A-57380DECD0E6"
Run Code Online (Sandbox Code Playgroud)

但是在一些样品中我发现了

Guid="{00AD2D6E-BF8A-4EA8-BE9A-57380DECD0E6}"
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二个版本,因为这是由GuidGen工具直接生成的.但这是对的吗?

installer windows-installer wix

7
推荐指数
2
解决办法
2820
查看次数

如何检查无参数构造函数的类型?

因为我想避免异常,我想检查一个类型是否具有无参数构造函数.我怎样才能做到这一点?

我需要这样的东西:

bool HasDefaultConstructor<TT>(TT source)
{
   return ???;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我想创建一个与源相同类型的对象,如果它没有默认构造函数,我想使用默认(TT).

我现在拥有的是:

        static TT CreateObject<TT>(TT source)
    {
        try
        {
            if(!HasDefaultConstructor<TT>(source))
            {
                return default(TT);
            }
            return (TT)Activator.CreateInstance(source.GetType());
        }
        catch(Exception ex)
        {
            Trace.WriteLine("Exception catched!\r\n" + ex);
        }
        return default(TT);
    }
    static bool HasDefaultConstructor<TT>(TT source)
    {
        ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });

        return c != null;
    }
Run Code Online (Sandbox Code Playgroud)

但是检查给了我真实的并且CreateInstance抛出了异常

没有无参数的构造函数

解:

bool HasDefaultConstructor(Type t)
{
   return t.GetConstructor(Type.EmptyTypes) != null;
}
Run Code Online (Sandbox Code Playgroud)

有许多递归函数和迭代涉及到这种方式,已经调用了错误的泛型函数HasDefaultConstructor(带有类型对象).使用非泛型函数就可以了.

谢谢大家的建设性帮助.

.net c# reflection constructor

6
推荐指数
2
解决办法
2357
查看次数

新窗口后程序不会停止

也许是C#,WPF,.NET 4.0的一个愚蠢的问题:

如果我在窗口派生类上执行新操作并且不在此窗口上调用ShowDialog,则我的程序在关闭时不再关闭.

例:

        Window d = new Window();
        //d.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我不想显示窗口,我只想将此对象用于某些目的.那么为了让我的程序在之后关闭,我该怎么办呢?

.net c# wpf

5
推荐指数
1
解决办法
269
查看次数

GridView中的按钮:我如何知道哪个项目?

我想在GridView的每一行中都有一个按钮来对该行执行操作.我能够获得点击,但如何确定此按钮属于哪一行?

我现在拥有的是:

        <ListView ItemsSource="{Binding Calibrations}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Voltage [kV]" Width="70" DisplayMemberBinding="{Binding Voltage}" />
                    <GridViewColumn Header="Filter" Width="100" DisplayMemberBinding="{Binding FilterName}" />
                    <GridViewColumn Header="Calibration Date" Width="100" DisplayMemberBinding="{Binding CalibrationDate}" />
                    <GridViewColumn Header="Calibration" Width="60">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Start" Click="OnStart" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>


        private void OnStart(object sender, RoutedEventArgs e)
    {
        // how do I know, on which item this button is
    }
Run Code Online (Sandbox Code Playgroud)

是否有某种方法可以将此行上的项绑定到RoutedEventArgs?

c# wpf binding gridview

5
推荐指数
1
解决办法
770
查看次数

从视图模型访问视图

我知道这是糟糕的设计,但我需要从我的视图模型访问视图。这是因为我有一些旧控件,例如 Winforms 控件,它们不支持绑定,需要通过代码填充。

我正在使用 AvalonDock 2.0 的 MVVM 模型并且有类似的东西:

   <ad:DockingManager x:Name="dockManager" 
                  DocumentsSource="{Binding Files}"
                  AnchorablesSource="{Binding Tools}"
        ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}">
        <ad:DockingManager.LayoutItemTemplateSelector>
            <local:PanesTemplateSelector>
                <local:PanesTemplateSelector.NavigationViewTemplate>
                    <DataTemplate>
                        <tvext:TreeViewExtended />
                    </DataTemplate>
                </local:PanesTemplateSelector.NavigationViewTemplate>
            </local:PanesTemplateSelector>
        </ad:DockingManager.LayoutItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud)

因此模板 NavigationViewTemplate 绑定到集合 Tools 的一项,即我的 NavigationViewModel 类型的 ViewModel。

我没有问题,例如将 TextBox 绑定到我的视图模型的属性。但我不知道如何从我的 NavigationViewModel 访问模板内的 tvext:TreeViewExtended 控件以填充它。

蒂亚·迈克尔

data-binding wpf xaml mvvm

3
推荐指数
3
解决办法
2万
查看次数

如何打破UnitTesting.Assert.AreEqual?

VS UnitTest项目中断言的标准行为是告诉我测试在特定行上失败了.

然而有时候,如果我可以在这样的断言失败时打破它会很方便.因为只在该行上设置断点也会导致测试用例失败.如果我能断言断言失败,我可以立即看到哪个测试用例失败了.

当断言失败时,如何暂时告诉VS中断?

例如,我在单元测试中以下列方式有许多循环,并想知道哪个迭代失败:

foreach(var testcase in testcases)
{
    Assert.AreEqual(testcase.ExpectedOutputData, FuncionUnderTest(testcase.InputData));
}
Run Code Online (Sandbox Code Playgroud)

c# unit-testing visual-studio-2010

3
推荐指数
1
解决办法
816
查看次数

如何将StreamingContext传递给DataContractSerializer?

我正在尝试将一些数据传递给DataContractSerializer的StreamingContext,但我无法弄清楚如何.以下是我的代码的一小部分示例:

MemoryStream stream = new MemoryStream();
DataContractSerializer serializer = new DataContractSerializer(typeof(OldClass));
serializer.WriteObject(stream, _OldClass);
stream.Seek(0, SeekOrigin.Begin);

serializer = new DataContractSerializer(typeof(NewClass));
    //here I would like to give the serializer e.g. a string as StreamingContext.Context
_NewClass = (NewClass)serializer.ReadObject(stream);
Run Code Online (Sandbox Code Playgroud)

c# serialization datacontractserializer

3
推荐指数
1
解决办法
485
查看次数