小编Ada*_*ley的帖子

C#:顺序函数调用如何工作?(效率明智)

在C#中,以相当客观的方式编写是常规的,如下所示:

MyObj obj = new MyObj();
MyReturn ret = obj.DoSomething();
AnotherReturn rett = ret.DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

我可以像这样写上面的内容:

AnotherReturn rett = new MyObj().DoSomething().DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

但是,当你在这样的序列中进行一系列函数调用时,堆栈框架如何工作?这个例子相当简单,但想象一下,如果我有50多个链接的函数调用(这可能发生在JavaScript(/ w jQuery)之类).

我的假设是,对于每个函数调用,返回地址(到"点"?),然后返回值(带有其他方法的新对象)立即被泵入该返回地址的下一个函数调用.这是如何工作到整体返回值(在这个例子中,返回地址将最终的函数值分配给rett)?如果我一直链接电话,我最终会溢出?在这种情况下,采取客观路线(以"不必要的"记忆分配为代价)是否更为明智?

c# optimization stack

6
推荐指数
1
解决办法
480
查看次数

不可变状态 - 有效地传播GUI的变化

在上一个问题中,我问过如何习惯性地为F#应用程序实现一个观察者模式.我的应用程序现在使用MailboxProcessor作为推荐,我已经创建了一些辅助函数来创建子邮箱处理器等.但是,当涉及到GUI绑定的特定案例场景时,我处于心理障碍.

让我们说我有一个模型:

type Document = {
    Contents : seq<DocumentObject>
}
Run Code Online (Sandbox Code Playgroud)

GUI(WPF,XAML)需要绑定,如下所示:

interface IMainWindowViewModel
{
    IEnumerable<Control> ContentViews { get; }
}
Run Code Online (Sandbox Code Playgroud)

每个ViewModel每个Control都需要一个DocumentObject(其底层模型),并知道它是否已经改变的一种方式.我提供这个作为一个子项,MailboxProcessor<DocumentObject>以便可以正确传播更改,我对这种模式有效.本质上,它映射服务输出并包装修改请求(下面的外部接口示例):

let subSvc = generateSubSvc svc (fun doc -> doc.Contents[0]) (fun f -> fun oldDoc -> { oldDoc with Contents[0] = f Contents[0] })
let viewModel = new SomeDocObjViewModel(docObjSvc)
new DocObjView(viewModel)
Run Code Online (Sandbox Code Playgroud)

现在,想象一个修改命令现在删除DocumentObjectMyDocument.顶级MailboxProcessor现在回应IMainWindowViewModel使用它的变化IEvent<MyDocument>.这就是我的问题开始的地方.

IMainWindowViewModel真的不知道 哪个DocumentObject …

wpf user-interface f# immutability observer-pattern

6
推荐指数
1
解决办法
809
查看次数

可变状态和观察者模式

我目前正在重新开发F#中的应用程序,虽然经验非常出色,但在控制可变性时我发现自己有点困惑.

以前,我的C#程序使用的文档模型是高度可变的,并实现了ObservableCollections和INotifyPropertyChanged,它们之间的共享状态不会出错.显然,这不是一个理想的选择,特别是如果我想要一个完全不可改变的设计方法.

考虑到这一点,我为我的底层应用程序内核创建了一个不可观察的,不可变的文档模型,但是,因为我希望UI订阅者看到更改,我立即发现自己实现了事件驱动模式:

// Raw data.
type KernelData = { DocumentContent : List<string> }

// Commands that act on the data.
type KernelCommands = { AddString : string -> () }

// A command implementation. Performs a state change, echos the new state through the event.
let addStringCommand (kernelState : KernelData) (kernelChanged : Event<KernelData>) (newString : string) =
    kernelState with { DocumentContent=oldList |> List.add newString }
    |> kernelChanged.Trigger

// Time to wire this up.
do
    // Create some starting state. …
Run Code Online (Sandbox Code Playgroud)

f# mutable observer-pattern

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

将() - > int放入F#类型

我有一个使用(通用)服务来执行IO操作的应用程序.我想将常用的IO函数(Save,SaveAs等)聚合成F#类型,但编译器似乎不喜欢这种表示法:

type InputService<'a> = {
    // Fine
    SomeFunc : 'a -> Option<'a>

    // Error (VS2012): "Anonymous type variables are not permitted in this declaration"
    Save : 'a -> ()

    // Error (see above)
    Load : () -> 'a
}
Run Code Online (Sandbox Code Playgroud)

我知道像这样的有状态函数可能不是惯用的.实际上,我计划在UI提示,文件路径等方面进行讨论,但是可以在我的类型中定义该函数签名吗?

f# types

2
推荐指数
1
解决办法
184
查看次数