从性能角度来看,使用静态方法是否比 lambda 表达式更好?由于lambda表达式每次都会生成一个闭包对象并保存对所使用的局部变量的引用。
我不明白为什么当标准读取 json 配置文件时,配置参数以字符串形式出现,无论它们如何写入 json 文件。
让我解释一下。
在这里,我在 NET Core 8 上创建一个标准控制台项目,在那里添加依赖项Microsoft.Extensions.Configuration
并Microsoft.Extensions.Configuration.Json
然后我直接写到Main
var builder = new ConfigurationBuilder().AddJsonFile("appSettings.json", false, false);
var configuration = builder.Build();
var rc = configuration["retryCounter"];
然后我添加 appSettings.json ,上面写着
{
"retryCounter": 42
}
...在代码中我得到一个值为“42”的字符串:
这是我不明白的地方:
我们的 json 已经输入了。是的,只有原始类型,但是数量
"retryCounter": 42
与字符串不同
"retryCounter": "42"
如果我使用我自己的类,某种
MySettings.cs
带有其中描述的字段的类,并将其序列化 - 将其反序列化为 json - 那么我将进行到 json 的转换并返回,保留基本类型(int、string、float)同时,使用配置和ConfigurationBuilder是推荐的方式。也就是说,如果你做错了,那么在合适的地方他们会给你一个耳光。
那么为什么这个推荐路径如此有限并且与使用 ini 文件没有什么不同呢?这里有什么我不明白的意思吗,或者只是“世界上所有的数据都是字符串,我们不应该欺骗自己”?
我试图List<Action> actionsList
按一组字段的值进行排序,GetActionPriority
它返回该组的总“权重”:
actionsList.Sort((Action first, Action second) =>
GetActionPriority(first).CompareTo(GetActionPriority(second)));
但同时,我希望在排序时,稍后添加到集合中的元素(即集合中具有较大的索引值)最终不会更接近集合的开头。怎样会actionsList.OrderBy(x=>GetActionPriority(x)).ThenOrderBy(<начальный индекс элемента в коллекции>)
。我仍然不知道如何在没有在操作中输入附加参数的情况下执行此操作,我希望得到您的帮助 ps我不确定没有附加限制的内置算法不会根据原始索引
你好,这是问题所在。我有一个包含精灵的数组,我需要在 UI 画布中迭代和显示精灵,我不明白为什么 Unity 会这样抱怨:
大批:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[CreateAssetMenu(menuName ="Dialogue/DialogueObject")]
public class DialogueObject : ScriptableObject
{
[SerializeField] [TextArea] private string nameChar;
[SerializeField] private Sprite[] imgObj;
[SerializeField] [TextArea] private string[] dialogue;
[SerializeField] private Response[] responses;
public Sprite[] ImgObj => imgObj;
public string NameChar => nameChar;
public string[] Dialogue => dialogue;
public bool HasResponses => Responses != null && Responses.Length > 0;
public Response[] Responses => responses;
}
这是我尝试显示图像的代码:
using UnityEngine;
using TMPro;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class DialogueUI : MonoBehaviour
{
[SerializeField] private GameObject dialogueBox;
[SerializeField] private TMP_Text textLable;
[SerializeField] private TMP_Text textName;
[SerializeField] private Image imgHandler;
public bool IsOpen {get; private set;}
private ResponseHandler responseHandler;
private TypeWriterEffect typeWriterEffect;
private void Start() {
typeWriterEffect=GetComponent<TypeWriterEffect>();
responseHandler = GetComponent<ResponseHandler>();
imgHandler = GetComponent<Image>();
CloseDialogueBox();
}
public void ShowDialogue(DialogueObject dialogueObject){
IsOpen = true;
dialogueBox.SetActive(true);
string nameChar = dialogueObject.NameChar;
textName.text = nameChar;
StartCoroutine(StepTroughtDialogue(dialogueObject));
StartCoroutine (ImgInDialogue(dialogueObject));
}
public void AddResponseEvents(ResponseEvent[] responseEvents){
responseHandler.AddResponseEvents(responseEvents);
}
private IEnumerator ImgInDialogue(DialogueObject dialogueObject){
for (int i = 0; i < dialogueObject.ImgObj.Length; i++ ){
Sprite imgObj = dialogueObject.ImgObj[i];
imgHandler.sprite = imgObj;
yield return null;
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
}
}
private IEnumerator StepTroughtDialogue(DialogueObject dialogueObject){
for (int i = 0; i < dialogueObject.Dialogue.Length; i++ ){
string dialogue = dialogueObject.Dialogue[i];
yield return RunTypingEffect(dialogue);
textLable.text = dialogue;
if (i == dialogueObject.Dialogue.Length - 1 && dialogueObject.HasResponses) break;
yield return null;
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
}
if (dialogueObject.HasResponses)
{
responseHandler.ShowResponses(dialogueObject.Responses);
}
else
{
CloseDialogueBox();
}
}
private IEnumerator RunTypingEffect(string dialogue){
typeWriterEffect.Run(dialogue, textLable);
while (typeWriterEffect.IsRunning){
yield return null;
if (Input.GetKeyDown(KeyCode.Space)){
typeWriterEffect.Stop();
}
}
}
public void CloseDialogueBox(){
IsOpen = false;
dialogueBox.SetActive(false);
textName.text=string.Empty;
textLable.text=string.Empty;
}
}
我正在开发Blazor应用程序,并尝试通过URL
.
但是我收到错误:
System.NullReferenceException:
"Object reference not set to an instance of an object." productDTO было null.
Catalog.razor 是一个页面,我在该页面上显示产品列表,单击后,转到传递 ProductId 参数的 ProductCard 组件:
@code {
protected override async Task OnInitializedAsync()
{
var products = await ProductRepository.GetAll();
productsDTO = products.Select(p => new ProductDTO
{
Name = p.Name,
Img = p.Img,
Description = p.Description,
Price = p.Price
}).ToList();
}
private void OnProductClick(ProductDTO product)
{
NavigationManager.NavigateTo($"/ProductCard/{product.Id}");
}
}
一切正常并显示所需的一切。
ProductCard.razor 是一个以 ProductId 作为参数的组件:
@using Core
@using Core.DTO;
@using Core.Entities
@using Infrastructure.Repository
@page "/ProductCard/{ProductId:guid}"
@rendermode InteractiveServer
@inject ProductRepository productRepository
<div class="ProductCard">
<img src="@productDTO.Img" />
<div class="card-body"
<span class ="title">@productDTO?.Name</span>
<span class="price">@productDTO?.Price</span>
<span class="description">@productDTO?.Description</span>
<span class="specs">@productDTO?.Specs</span>
</div>
</div>
@code {
[Parameter]
public Guid productId { get; set; }
private ProductDTO productDTO;
protected override async Task OnInitializedAsync()
{
var product = await productRepository.GetByIdAsync(productId);
if (product != null)
{
productDTO = new ProductDTO
{
Id = product.Id,
Name = product.Name,
Img = product.Img,
Description = product.Description,
Price = product.Price,
Specs = product.Specs
};
}
else
{
Console.WriteLine("Продукт не найден");
}
}
}
}
Blazor 无法将 ProductId 识别为 ProductCard 中的参数,并且出现异常。