小编Tar*_*rik的帖子

动态创建代理类

我正在尝试动态创建代理类.我知道有一些非常好的框架可以做到这一点,但这纯粹是一个宠物项目作为一个学习练习,所以我想自己做.

例如,如果我有以下类实现接口:

interface IMyInterface
{
    void MyProcedure();
}

class MyClass : IMyInterface
{
    void MyProcedure()
    {
        Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

为了拦截这个类的方法以便记录它们,我正在创建另一个类(我的代理类版本),它实现相同的接口但包含对"真实"类的引用.此类执行操作(例如,日志记录),然后在真实类上调用相同的方法.

例如:

class ProxyClass : IMyInterface
{
    private IMyInterface RealClass { get; set; }

    void MyProcedure()
    {
        // Log the call
        Console.WriteLine("Logging..");

        // Call the 'real' method
        RealClass.MyProcedure();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用者调用代理类上的所有方法(我使用基本的home-brew IoC容器来注入代理类来代替真正的类).我正在使用此方法,因为我希望能够RealClass在运行时将其换出到另一个实现相同接口的类.

有没有办法ProxyClass在运行时创建并填充其RealClass属性,以便它可以用作真实类的代理?是否有一种简单的方法可以做到这一点,还是需要使用类似的东西Reflection.Emit并生成MSIL?

.net c# reflection proxy

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

了解虚拟地址,虚拟内存和分页

我一直在学习这些主题并阅读了许多文章和书籍,但他们都缺乏一些补充信息,让我更加困惑.所以在这里,我想在我提出问题时解释我所知道的.希望这个主题对我这样的人有用.如果有必要,我还想学习我的知识和更正的有效性.

虚拟内存

有些文章说"虚拟内存是硬盘的一些空间,模拟物理内存,这样我们就可以拥有比实际更多的内存." 其他一些文章说"虚拟内存是物理内存(RAM)的组合,硬盘的一部分就像物理内存和页面表."然而它们是不同的东西,我不明白为什么有这样的不同解释.

让我们来看第二个解释,因为维基百科也是如何描述虚拟内存的.此时虚拟地址是有意义的,因为我们直接使用虚拟内存中的地址而不是物理内存.

顺便说一句,我的Mac说我有8GB的物理内存和8GB的虚拟内存.在这种情况下,VM是否包含物理内存,还是HD用作内存的空间量?我的程序有16GB内存吗?

在此输入图像描述

问题1:

Intel i5具有36位地址总线,这意味着您可以寻址64GB内存.假设我在我的电脑上安装了4GB RAM.但是,我的程序可能不知道所安装内存的大小,因为它将在具有不同内存大小的许多不同系统上使用.这就是虚拟内存变得方便的地方.它抽象出安装的内存的实际大小.

但是,当我的程序想要访问内存地址0xFFFFFFFFF时会发生什么?我只安装了4GB,也许还有一些高清内存空间.

我对这个问题有两个理论:

1.由于页面表由操作系统维护,操作系统对该地址进行解码,找出哪个页面并检查页面表中的页面,看看它们是否有与之关联的物理地址(有效和无效标志),如果是然后转到虚拟地址中定义的物理内存+偏移量中的页面入口点的物理地址并带来该值.否则会发生页面错误,操作系统在辅助存储中查找该页面,获取它并将其放入内存并更新页面表.

2.它抛出OutOfMemory类型的异常,表示我没有任何给定地址可以解决的内存.

第一个理论的缺点是当程序想要使用64GB内存时会发生什么?然后我们需要有60GB的高清内存空间,因为我们只有4GB.但是,在屏幕截图下面MAC告诉我,只有8GB的虚拟内存.

问题2:

进程如何放入虚拟内存?我的意思是每个进程都有可用的0x0 - 0xFFFFFFFFF虚拟内存空间,或者只有一个虚拟内存地址空间可以放置所有进程吗?

如果每个进程都假定它们具有可用的所有内存,则内存如下所示:

在此输入图像描述

如果只有一个虚拟内存概念,那么它将如下所示:

在此输入图像描述

页表

因此,页表是位于物理地址和虚拟地址之间的数据结构.它是一个关联数组(或类似字典),对于每个页面(键),都有一个物理地址关联(值).

OS使用MMU(内存管理单元)执行从虚拟地址到物理地址的转换.

在此输入图像描述

问题3:

是否有一个巨大的巨型页面表,其中包含每个进程的所有页面,或者每个进程都有自己的页面表?

分页

分页是一种内存管理方法.虚拟内存和物理内存由内存管理单元分为页面(固定和相同大小的块).当您在内存和辅助存储之间交换页面时,此技术非常有用,以便您可以在它们之间交换页面.例如,您的程序请求位于地址中的数据.但是,程序使用的地址是虚拟地址,MMU使用页表对其进行转换.在此期间,MMU检查页表是否在页表中存在所请求的内容,如果不是,则OS从辅助存储器获取它并更新页表.

问题4:

假设一个进程从一个地址请求数据,该地址被转换为已经有一些数据的物理地址.如何知道数据不属于请求者进程,应该替换为辅助存储中的数据?

例如,有脏位用于是否将该页面写回硬盘,但我不认为这是决定所有者进程的原因.

paging virtual-memory virtual-address-space

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

如何从其父接口获取派生类的实际类型

假设我们有一个像这样的代码部分:

IProduct product = ProductCreator.CreateProduct(); //Factory method we have here
SellThisProduct(product);

//...

private void SellThisProduct(IProduct product)
{
  //.. Do something here
}

//...

internal class Soda : IProduct
{}

internal class Book : IProduct
{}
Run Code Online (Sandbox Code Playgroud)

如何推断哪个产品实际传递到方法中的SellThisProduct()方法?

我想如果我说GetType()或者它可能会返回IProduct类型.

.net c# interface class

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

Threads有多不同的异步编程?

我一直在async这里阅读一些文章:http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45,作者说:

在进行异步工作时,并不总是使用线程.例如,当您发出异步Web服务请求时,ASP.NET将不会在异步方法调用和await之间使用任何线程.

所以我想要了解的是,async如果我们不使用任何线程进行并发执行,它会如何变成?这是什么意思"你并不总是使用线程."?

让我首先解释一下我对使用线程的了解(一个简单的例子,当然Threads可以在UI和Worker方法之外的其他情况下使用)

  1. 你有UI线程来获取输入,给出输出.
  2. 您可以在UI线程中处理事物,但它会使UI无响应.
  3. 所以我们假设我们有一个与流相关的操作,我们需要下载某种数据.
  4. 我们还允许用户在下载时执行其他操作.
  5. 我们创建一个新的工作线程,下载文件并更改进度条.
  6. 一旦完成,没有任何事情要做,所以线程被杀死.
  7. 我们从UI线程继续.

我们可以根据情况等待UI线程中的工作线程,但在下载文件之前,我们可以使用UI线程做其他事情,然后等待工作线程.

async编程不一样吗?如果没有,有什么区别?我读过async编程ThreadPool用来拉线程.

.net c# asp.net asynchronous

33
推荐指数
2
解决办法
7900
查看次数

Java中方法的最终变量

可能重复:
为什么在Java中将局部变量和方法参数标记为"final"?

我正在检查一些Java代码,我不擅长java至少有一些知识,如密封类,只读字段和不可覆盖的方法,但这对我来说很奇怪,final在方法中声明一个变量:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception {
    // Set up Books client.
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory)
        .setApplicationName("Google-BooksSample/1.0")
        .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
          @Override
          public void initialize(JsonHttpRequest request) {
            BooksRequest booksRequest = (BooksRequest) request;
            booksRequest.setKey(ClientCredentials.KEY);
          }
        })
        .build();
Run Code Online (Sandbox Code Playgroud)

你能告诉我final在这种情况下的含义是什么吗?

这是完整的代码:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/ BooksSample.java?repo=samples

java final

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

synchronized(this)和synchronized方法有什么区别

可以说我们有这两个示例代码:

public synchronized void getSomething(){
     this.hello = "hello World";
}
Run Code Online (Sandbox Code Playgroud)

还有这个

public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}
Run Code Online (Sandbox Code Playgroud)

所以有人可以告诉我现在的区别是什么?

java thread-safety

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

从AssemblyInfo.cs获取程序集版本

我们AssemblyInfo.cs的Web应用程序中有一个文件,但我们在同一个解决方案中有其他项目.他们大多是类库.我被告知要AssemblyInfo.cs在我们的UI上显示汇编版本.我在程序中的C#AssemblyFileVersion用法中找到了以下解决方案

using System.Reflection;
Version version = Assembly.GetExecutingAssembly().GetName().Version;
Run Code Online (Sandbox Code Playgroud)

要么

using System.Reflection;
using System.IO;

FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo
                               (Assembly.GetExecutingAssembly().Location);

Console.WriteLine("AssemblyVersion : {0}", 
         Assembly.GetExecutingAssembly().GetName().Version.ToString());

Console.WriteLine ("AssemblyFileVersion : {0}" , 
         fv.FileVersion.ToString ());
Run Code Online (Sandbox Code Playgroud)

但这让我感到困惑.它说GetExecutingAssembly(),如果它在其他类库的另一个程序集上运行怎么办?这些代码AssemblyInfo.cs是否会始终从驻留在Web项目中的文件中获取?(这就是我想要的)

c# asp.net-mvc assemblyinfo

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

哪一个更有效:List <int>或int []

谁能告诉我,哪一个是之间更有效的List<int>int[].因为我正在研究一个项目,你可能知道效率是如此重要的关注点.

如果您在帖子中添加了一些介绍性说明,那就太棒了:)

c# list

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

区别?(通配符)和Java中的Type参数

有人可以解释一下这两种方法之间的区别吗?它们一样吗?就他们解决的问题而言,他们看起来与我相同.如果它们相同,为什么需要?

方法#1,无界限

public static void printList(List<?> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#2,无界:

public static <T> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#1,有界

public static void printList(List<? extends Number> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#2,有界:

public static <T extends Number> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println(); …
Run Code Online (Sandbox Code Playgroud)

java generics

27
推荐指数
3
解决办法
6622
查看次数

在Asp.Net中以编程方式添加StyleSheets

我想以编程方式在head部分添加StyleSheets,但我看到的一个示例似乎需要多行代码才能添加一个样式表,即使我可能需要很多:

示例代码:

HtmlLink css = new HtmlLink();
css.Href = "css/fancyforms.css";
css.Attributes["rel"] = "stylesheet";
css.Attributes["type"] = "text/css";
css.Attributes["media"] = "all";
Page.Header.Controls.Add(css);
Run Code Online (Sandbox Code Playgroud)

我也使用Page.Header.RenderControl()方法,但它也没有用.Object null抛出了一些错误.

我还使用了Page.Header.InnerHtmlInnerText += "<link .... "/>事,但他们扔了文字错误这是我觉得常见的错误.

我用过这段代码:

List<Literal> cssFiles = new List<Literal>();
cssFiles.Add(new Literal() { Text = @"<link href=""" +   ResolveUrl("~/Resources/Styles/MainMaster/MainDesign.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
cssFiles.Add(new Literal() { Text = @"<link href=""" + ResolveUrl("~/Resources/Styles/MainMaster/MainLayout.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
AddStyleRange(cssFiles);

private void AddStyleRange(List<Literal> cssFiles)
{
   foreach (Literal item in cssFiles) …
Run Code Online (Sandbox Code Playgroud)

css c# asp.net

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