Является ли в блоке динамического ключевого слова типы значений?C#

Место общения программистов C#
Ответить
Anonymous
 Является ли в блоке динамического ключевого слова типы значений?

Сообщение Anonymous »

Этот проект ASP.NET MVC Framework 4.8 с Entity Framework 6 и использует: < /p>

Код: Выделить всё

dynamic GetSystemSetting(string paramCode, string paramType)
< /code>
Он содержит значения int, float, bool, string и guid. Это один из самых используемых методов в приложении. Я знаю, что динамика плохая. Мне нужно больше контекста. Эта функция: < /p>
public dynamic GetSystemSetting(string paramCode, string paramType)
{
dynamic result = "";
// Code implementation here
switch(paramType)
{
case "B":
result = _dataService.Get(paramCode).BitValue;
break;
case "S":
result = _dataService.Get(paramCode).StringValue;
break;
case "N":
result = _dataService.Get(paramCode).NumericValue;
break;
case "G":
result = _dataService.Get(paramCode).GuidValue;
break;
}
return result;
}
< /code>
GuidValue
, StringValue , NumericValue и BitValue являются столбцами в базе данных. Я сравнивал динамическое ключевое слово и заметил, что типы значений получают штучку, а память выделяется на кучу. Была ли хорошей реализацией, и имеет ли мой эталон смысл?using BenchmarkDotNet.Attributes;

namespace Benchmark_EfCore.Benchmarks;

[MemoryDiagnoser]
public class DynamicBenchmark
{
private List IntList { get; set; } = new List();
private List GuidList { get; set; } = new List();

[GlobalCleanup]
public void GlobalSetup()
{
IntList = Enumerable.Range(0, 100).ToList();
for (var i = 0; i < IntList.Count; i++)
{
GuidList .Add(Guid.Empty);
}
}

[Benchmark]
public dynamic GetIntValue()
{
return IntList.Find(a => a == 50);
}

[Benchmark]
public int GetValueExplicit()
{
return IntList.Find(a => a == 50);
}

[Benchmark]
public dynamic GetGuidValue()
{
return GuidList.Find(a => a == Guid.Empty);
}

[Benchmark]
public Guid GetGuidValueExplicit()
{
return GuidList.Find(a => a == Guid.Empty);
}
}
< /code>
The results:
BenchmarkDotNet v0.13.7, Windows 11 (10.0.22631.5699)
11th Gen Intel Core i3-1115G4 3.00GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 8.0.404
[Host] : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
DefaultJob : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
< /code>



method < /th>
означает < /th>

4.0551 ns < /td>
0,0076 < /td>
24 b < /td>
< /tr>
getValueExplicit < /td>
0,5986 ns < /td>
0,0664 ns < /td>
0,9470 нс < /td>
0,0466 NS < /td>
0,0573 ns < /td>
-
-



Я разбил код с помощью IL Viewer в jetbrains Rider:

.[Benchmark(22, "D:\\Benchmark_EfCore\\Benchmarks\\DynamicBenchmark.cs")]
[return: Dynamic]
public object GetIntValue()
{
return (object) this.IntList.Find(DynamicBenchmark.c.9__9_0 ?? (DynamicBenchmark.c.9__9_0 = new Predicate((object) DynamicBenchmark.c.9, __methodptr(b__9_0))));
}

[Benchmark(28, "D:\\Benchmark_EfCore\\Benchmarks\\DynamicBenchmark.cs")]
public int GetValueExplicit()
{
return this.IntList.Find(DynamicBenchmark.c.9__10_0 ?? (DynamicBenchmark.c.9__10_0 = new Predicate((object) DynamicBenchmark.c.9, __methodptr(b__10_0))));
}
< /code>
Is that helper function good practice? It was on Entity Framework 6 (not Entity Framework Core). Please explain this dynamic usage and how it affects the application at runtime and through put.

Подробнее здесь: https://stackoverflow.com/questions/797 ... alue-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»