我有一个自定义类,可以从网络上获取一些数据。
当我得到这些数据时,我想将其设置为属性的值,但是当我这样做时,它会崩溃。带注释的行会导致崩溃,而没有该行,一切正常。参见下面的代码:
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class GetDB
{
private readonly Main m;
private readonly string Url;
public string DBData {
get
{
if(DBData == null)
return null;
else
return DBData;
}
private set
{
DBData = value;
}
}
public GetDB(Main m, string url)
{
this.m = m;
this.Url = url;
}
public void GetServerData(){
m.StartCoroutine(GetText(Url, (result) =>{
this.DBData = result; //THIS LINE CRASHES UNITY
Debug.Log(result);
}));
}
IEnumerator GetText(string url, Action<string> result) {
UnityWebRequest www = UnityWebRequest.Get(url);
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError) {
Debug.Log(www.error);
}
else {
if (result != null)
result(www.downloadHandler.text);
}
}
}
我将如何解决此问题,这到底是怎么回事?
如果不清楚,请告诉我,以便澄清。
答案 0 :(得分:4)
您必须使用属性的后备字段:
string _dbData;
public string DBData
{
get
{
if(_dbData == null)
return null;
else
return _dbData;
}
private set
{
_dbData= value;
}
}
对于getter和setter方法,属性只是语法糖。因此,您可以像这样重写您的媒体资源:
public string GetDBData()
{
if(_dbData == null)
return null;
else
return _dbData;
}
public void SetDBData(string value)
{
_dbData = value;
}
实现属性的方式:
public void SetDBData(string value)
{
// you will never get out of here
SetDBData(value);
}
答案 1 :(得分:2)
属性充当变量的访问器。在您的情况下,发生的事情基本上是一个无休止的循环-每当有人尝试获取您的属性的值时,它都会不断返回属性本身。相反,您需要一个后备字段_dbData:
private string _dbData;
public string DBData
{
get
{
return _dbData;
}
private set
{
_dbData = value;
}
}
现在,您的媒体资源将控制对此字段的访问。
答案 2 :(得分:1)
您的访问器可以真正简化。
这样做:
description
将提供与执行结果完全相同的结果:
photos
因此,您可以这样编写访问器:
get
{
if(DBData == null)
return null;
else
return DBData;
}